Nginx介紹
php
Nginx(「engine x」)是一個高性能的HTTP和反向單利服務,也是一個IMAP/POP3/SMTP代理服務器。由lgor Sysoev爲俄羅斯訪問量第二的Rambler.ru站點開發的。Nginx已經由於它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名,目前國內各大門戶網站已經部署了Nginx,如新浪網易、騰訊等;新近發現Nginx技術在國內日趨火熱,愈來愈多的網站開始部署Nginx。nginx
官網:nginx.orgweb
Nginx特性正則表達式
基本功能 #靜態資源的web服務器,可以自動緩存打開的文件描述符; #反向代理服務器,可以緩存、負載均衡; #支持FastCGI協議,------->可實現LNMP #模塊化,非DSO機制(不能動態加載模塊),支持過濾器gzip,支持SSI和圖像大小調整等 #支持SSL
擴展功能 #基於名稱和IP作虛擬主機 #支持keepalive #支持平滑配置更新或程序版本升級 #定製訪問日誌,支持使用日誌緩存以提升性能 #支持url rewrite #支持路徑別名 #支持基於IP及用戶的認證; #支持速率限制,併發限制等;
Nginx的基本架構vim
# 1)一個master,生成一個或多個worker # 2)事件驅動:kqueue,epoll,/dev/poll # 消息通知:select、poll、rt signals # 3)支持sendfile,sendfile64 # 4)支持AIO 異步IO # 5)支持mmap 內存映射 Nginx:非阻塞、事件驅動、一個master多個worker、一個worker響應多個請求 ##注意work進程應該以普通用戶身份運行:nginx用戶、nginx組
Nginx的模塊級別緩存
# 1)核心模塊 # 2)標準http模塊 # 3)可選的http模塊 # 4)郵件模塊 # 5)第三方拓展模塊
Nginx安裝方法性能優化
# 1)編譯安裝 # 2)rpm包安裝---須要epel源
Nginx的配置文件bash
# main 配置段 ---------- 核心模塊 # http { ---------- http標準模塊 # } # 配置參數須要以分號結尾,語法格式: # 參數名 值1[值2...]; # 還支持使用變量: # 模塊內置變量 # 用戶自定義變量 # set var_name value
Nginx基本配置的類別服務器
1)用於調試、定位問題 2)正常運行的必備配置 3)優化性能的配置 4)事件類的配置
詳解Nginx的配置 (一)正常運行的必備配置 # 一、user username [groupname]; # 指定運行worker進程的用戶和組 # 二、pid /path/to/pidfile_name; # 指定nginx的pid文件 # 三、worker_rlimit_nofile #; # 指定一個worker進程所可以打開的最大文件句柄數 # 四、 worker_rlimit_sigpending #; # 設定每一個用戶可以發往worker進程的信號和數量; (二)性能優化行管的配置 # 一、work_processes #; # worker進程的個數;一般其數值應該爲CPU的物理核心數減1; # 二、work_cpu_affinity cpumask ...; # 以掩碼的方式指定特定的CPU用於nginx進程使用 # 三、ssl_engine device; # 在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備; # 四、timer_resolution t; # 每次內核時間調用返回時,都會使用gettimeofday ()來更新nginx的緩存時鐘;timer_resolution用於定義每隔多久纔會由gettimeof day() 更新一次緩存時鐘; x86_64系統上,gettimeofday()代價已經很小,能夠忽略此配置; # 五、 worker_priority nice; # - 20,19之間的值 (三)事件相關的配置 #一、accept_mutex [on | off] ----------用於events模塊中 # 是否打開Ningx的負載均衡鎖;此鎖可以讓多個worker進程輪流的、序列化的與新的客戶端創建聯結;而一般當一個worker進程的負載達到某上限的7/8時,master就儘量再也不將請求調度此worker; #二、lock_file /path/to/lock_file; # lock文件 #三、accept_mutex_delay #ms; 默認500ms # accept鎖模式中,一個worker進程爲取得accept鎖的等待時長;若是某 worker進程在某次試圖取得鎖時失敗了,至少要等待#ms才能再一次請求鎖; #四、multi_accept on | off; # 是否容許一次性地響應多個用戶請求;默認爲off #五、use [epoll | rtsig | select | poll |] # 定義使用的事件模型,建議讓nginx自動選擇 #六、work_connections #; # 每一個worker可以併發響應最大請求數;
Nginx的http模塊架構
#必須使用虛擬機來配置站點;每一個虛擬主機使用一個server {}段配置; server { } #非虛擬主機的配置或公共配置,須要定義在server以外,http以內; http { directive value; ... server { } } # 一、 server {} # 定義一個虛擬主機:nginx 支持使用基於主機名或IP的虛擬主機; # 二、 listen # listen address [:port]; # listen port # default_server : 定義此server 爲http中默認的server; 若是全部的server中沒有任何I個listen使用此參數,那麼第一個server 即爲默認server; # rcvbuf=SIZE : 接受緩衝大小; # sndbuf=SIZE :發送緩衝大小; # ssl : https server; # 三、 server_name [...]; # server_name 能夠跟多個主機名;名稱中可使用通配符和正則表達式(一般以~開頭);當nginx收到一個請求時,會去除其首部的server的值,然後跟衆server_name進行比較;比較方式: # (1)先作精確匹配; www.jungege.com # (2)左側通配符匹配; *.jungege.com # (3) 右側通配符匹配; www.jungege.com, www.* # (4) 正則表達式匹配; ~^.*\.jungege\.com #四、server_name_hash_bucket_size 32|64|128; # 爲了實現快速主機名查找,nginx使用hash來保存主機名; #五、location [ = | ~ | ~* | ^~] uri { ... } --->定義uri的訪問屬性 # location @name { ... } # 功能: 容許根據用戶請求的URI來匹配指定的各location以進行訪問配置;配置到時,將被location塊中的配置所處理; = : 精確匹配; ~ :正則表達式模式匹配,匹配時區分字符大小寫 ~* : 正則表達式模式匹配,匹配時忽略字符大小寫 ^~: URI的前半部分匹配,不檢查正則表達式 # 匹配優先級:字符字面量最精確匹配、正則表達式檢索(若是有多個匹配,由第一個匹配到所處理)、按字符字面量
Localtion文件路徑定義
#一、root path # 設置web資源存放路徑;用於指定請求的根文檔目錄; location / { root /www/htdocs; } #二、alias path # 只能用於location中,用於路徑別名; location / { root /www/htdocs; } location ^~ /p_w_picpaths/ { alias /web; } #三、index file ...; # 定義默認頁面,能夠跟多個值;
Ningx編譯安裝
1)安裝gcc開發環境 # yum -y install "Development tools" "Server Platform Development" 2)安裝 pcre-devel openssl-devel # yum -y install pcre-devel openssl-devel 3) 設置用戶 # groupadd -r nginx # useradd -r -g nginx nginx 4)下載nginx-1.4.7穩定版 # wget http://nginx.org/download/nginx-1.4.7.tar.gz 編譯安裝 # tar xf nginx-1.4.7.tar.gz # cd nginx-1.4.7 # ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre # make && make install 5)檢測配置文件語法 # /usr/sbin/nginx -t 6) 提供啓動腳本 # vim /etc/rc.d/init.d/nginx 內容以下 # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac 7)添加到系統服務並開機啓動 # chkconfig --add nginx # chkconfig nginx on # chkconfig --list nigx 8) 設置nginx配置文件的語法高亮 # mkdir ./vim/syntax -pv # cd .vim/syntax # wget http://www.vim.org/scripts/download_script.php?src_id=19394 # cd .vim # vim filetype.vim 內容以下 au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif 9)啓動服務 # service nginx start # pa aux | grep nginx 至此,編譯及後續工做完成
PS:總結也許不夠全面,多多包涵,關於Nginx的反向代理,及LNMMP架構的實現立刻推出,敬請期待!