nginx是http服務器和反向代理服務器,又是IMAP/POP3/SMTP 代理服務器
nginx特性:
基本功能:
1、能夠實現服務於靜態文件,也就是靜態資源的web服務器,能自動緩存打開的文件描述符;
2、反向代理服務器,能夠實現簡單的負載均衡和冗餘
3、能夠支持FastCGI協議
4、有模塊化話功能,但非DSO(動態裝卸載)機制,支持多種過濾器gzip,SSI和完成圖像大小調整等
5、支持SSL功能
擴展功能:
1、能夠基於名稱和IP做虛擬主機
2、支持keepalive
3、支持平滑的配置更新或程序版本升級
4、支持定製訪問日誌,支持使用日誌緩存以提高性能
5、支持url rewrite(地址重寫)
6、支持路徑別名
7、支持基於IP及用戶的認證
8、支持速率限制,併發限制等
nginx的基本架構:
是由一個master生成一個或多個worker結合工作,一個worker響應多個用戶請求;基於事件驅動工作,有kqueue,epoll,/dev/poll(非事件驅動,是消息通知的有select,poll,rt singals);支持sendfile;支持AIO機制(異步IO);支持mmap
特性總結:nginx有非阻塞、事件驅動,一個master生成多個worker,一個worker響應多個用戶請求的特性;master進程多用於平滑升級。
nginx的模塊類別:
核心模塊
標準http模塊
可選的http模塊
郵件模塊
第三方擴展模塊
nginx的使用:
安裝方法:
編譯安裝
rpm安裝:yum(epel源中)
安裝環境:
# yum install Development Tools Server Platform Developmengt # yum install pcre-devel
nginx的配置文件:
main配置段
http配置段
http {
}
注:在配置參數需要以分號結尾,否則會認爲是語法錯誤;#表示註釋信息;配置語法格式: 參數名 配置值1[值2......]
配置文件中支持使用變量:有模塊內置變量和用戶自定義變量(ser var_name value)
nginx基本核心配置的類別:
用於調試,定位問題;正常運行的必備配置;優化性能的配置;優化性能的配置;事件類的配置
在nginx運行worker進程是以普通用戶身份運行的,爲nginx用戶和nginx組;
使用示例:
編譯安裝示例:
# get nginx-1.4.7.tar.gz \\下載程序包 # tar xf nginx-1.4.7.tar.gz \\解壓程序包 # ./configure \ --prefix=/usr/local/nginx \ --error-log-path=/data/applogs/nginx/error.log \ --http-log-path=/data/applogs/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=/usr/local/nginx/client/ --http-proxy-temp-path=/usr/local/nginx/proxy/ \ 緩存上流目錄 --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi \ --http-scgi-temp-path=/usr/local/nginx/scgi \ --with-pcre # make && make install # groupadd -r nginx \\創建組 # useradd -r -g nginx nginx \\創建用戶 # mkdir /var/tmp/nginx \\創建剛纔指定模塊的目錄 nginx的啓動路徑:/usr/sbin/nginx nginx的啓動選項,使用/usr/sbin/nginx -h 查看; -t:表示檢查配置文件信息 # vim /etc/rc.d/init.d/nginx \\添加腳本啓動服務文件 #!/bin/sh # # 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/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/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 # chmod +x /etc/rc.d/init.d/nginx \\添加執行權限,然後就可以啓動服務了 # mkdir .vim/syntax -pv \\ 因爲在配置文件中沒有顯示語法高亮, 這裏設置一下語法高亮,創建一個目錄,用於 存放顯示nginx配置文件語法高亮的程序包 # cd .vim/syntax #get nginx.vim \\下載名爲nginx.vim的程序包 #vim filetype.vim \\創建一個filetype的文件 au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == ' ' | setfiletype nginx | endif \\在filetype文件中添加此語句 # cd /etc/nginx # vim nginx.conf \\進入文件後便可發現語句已經高亮,下面爲配置文件的內容;
正常運行的必備配置:
user nginx; \\指定運行worker進程的用戶和組,格式:user username [groupname] pid /path/to/pidfile_name; \\指定nginx的pid文件 worker_rlimit_nofile # ; \\表示指定一個worker進程所能夠打開的最大文件句柄數 worker_rlimit_sigpending #; \\表示設定每個用戶能夠發往worker進程的信號數量
優化性能相關的配置:
worker_processes #; \\指定worker進程的個數,建議通常其數值應爲CPU的物理核心數減1;對提高系統性能有很大幫助 worker_cpu_affinity cpumask....; \\指定cpu掩碼;cpu掩碼是指當系統有幾顆cpu的物理核心就會顯示幾個0,比如:當有四個時則顯示爲0000,當需要調用1顆cpu時則使用0001來表示,當需要調用2顆時,則使用0010表示;當需要調用3顆時,則使用0100表示;對提高系統性能有很大幫助 ssl_engine device;\\指定存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備; timer_resolution t; \\每次內核事件調用返回時,都會使用gettimeofday()來更新nginx緩存時鐘;t表示時間值,每隔多長時間返回一次;timer_resolution用於定義每隔多久纔會由gettimeofday()更新一次緩存時鐘;在x86-64系統上,gettimeofday()代價已經很小,可以忽略此配置;但在較老的系統上可按使用情況設定 worker priority nice; \\優先級,nice值爲-20到19之間的值;對提高系統性能有很大幫助
事件相關的配置:
accept_mutex [on|off]; \\表示是否打開nginx負載均衡鎖;會均衡請求到worker進程上;此鎖能夠讓多個worker進程輪流的、序列化的與新的客戶端建立連接;而通常當一個worker進程的負載達到其上限的7/8時,master就儘可能不再將請求調度到此worker上;默認爲打開狀態 lock_file /path/to/lock_file; \\指定負載均衡鎖文件; accept_mutex_delay #ms; \\使用accept鎖模式中,一個worker進程爲取得accept鎖的等待時長;如果某個worker進程在某次試圖取得鎖時失敗了,至少要等待#ms才能再一次請求鎖;默認爲500毫秒(ms) multi_accept on|off; \\是否允許一次性的響應多個用戶請求;默認爲off use [epoll|rtsig|select|poll]; \\定義使用的事件模型,建議讓nginx自動選擇,默認爲epoll worker_connections #; \\每個worker能夠併發響應最大請求數;
用於調試、定位問題:只調試nginx時使用
daemon [on|off]; \\是否讓nginx運行後臺,默認爲on,調試時可以設置off,使得所有信息去接輸出控制檯 master_process on|off; \\是否以master/worker模式運行nginx,默認爲on,調試時可設置爲off以方便追蹤 error_log /path/to/error_log level; \\錯誤日誌文件及其級別,默認爲error級別;調試時可以使用debug級別,但要求在編譯時必須使用--with-debug啓用debug功能;
在nginx官網http://nginx.org中有更加詳細的配置文件解釋說明