1、Nginx簡介
html
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler使用。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:新浪、網易、 騰訊等。nginx
Nginx 能夠在大多數 Unix like OS 上編譯運行,並有 Windows 移植版,Nginx具備着衆多優勢。web
1)Nginx 是一個很強大的高性能Web和反向代理服務器,它具備不少很是優越的特性;正則表達式
2)Nginx 做爲負載均衡服務器:Nginx 既能夠在內部直接支持 Rails 和 PHP 程序對外進行服務,也能夠支持做爲 HTTP代理服務器對外進行服務;數據庫
3)Nginx 同時也是一個很是優秀的郵件代理服務器;vim
4)Nginx 採用C進行編寫,不管是系統資源開銷仍是CPU使用效率都比 Perlbal 要好不少。緩存
5)Nginx 是一個安裝很是的簡單,配置文件很是簡潔(還可以支持perl語法),Bugs很是少的服務器:Nginx 啓動特別容易,而且可以平滑升級。服務器
2013年最新統計Nginx 在Web Server市場中所佔的市場份額session
2、Nginx 的基本HTTP服務器特性架構
一、處理靜態文件,索引文件以及自動索引;打開文件描述符緩存;
二、使用緩存加速反向代理,簡單負載均衡以及容錯;
三、遠程FastCGI,uwsgi,SCGI,和memcached服務的緩存加速支持;
四、模塊化的架構,過濾器包括gzip壓縮、ranges支持、chunked響應、XSLT,SSI以及圖像縮放。在SSI 過濾器中,一個包含多個SSI的頁面,若是經由FastCGI或反向代理處理,可被並行處理;
五、支持SSL,TLS SNI。
3、Nginx 經常使用的其餘HTTP服務器的特性
1)基於名字和IP的虛擬主機;
2)Keep-alive和pipelined鏈接支持;
3)從新加載配置以及在線升級時,不須要中斷正在處理的請求;
4)自定義訪問日誌格式,帶緩存的日誌寫操做以及快速日誌輪轉;
5)3xx-5xx錯誤代碼重定向;
6)重寫(rewrite)模塊:使用正則表達式改變URI;
7)基於客戶端IP地址和HTTP基本認證機制的訪問控制;
8)來自同一地址的同時鏈接數或請求數限制,速度限制。
4、Nginx 經常使用的架構和擴展性
1)一個進程和多個工做進程;
2)支持事件機制;
3)支持AIO;
4)支持sendfile;
5)支持Accept-fileters.
5、Nginx 的進程工做
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工做進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。全部進程均是僅含有一個線程,並主要經過「共享內存」的機制實現進程間通訊。
一、主進程主要完成以下工做,主進程以root用戶身份運行:
1) 讀取並驗正配置信息;
2) 建立、綁定及關閉套接字;
3) 啓動、終止及維護worker進程的個數;
4) 無須停止服務而從新配置工做特性;
5) 控制非中斷式程序升級,啓用新的二進制程序並在須要時回滾至老版本;
6) 從新打開日誌文件,實現日誌滾動;
7) 編譯嵌入式perl腳本。
二、worker進程主要完成的任務包括:
1) 接收、傳入並處理來自客戶端的鏈接;
2) 提供反向代理及過濾功能;
3) nginx任何能完成的其它任務。
三、cache loader進程主要完成的任務包括:
1) 檢查緩存存儲中的緩存對象;
2) 使用緩存元數據創建內存數據庫。
四、cache manager進程的主要任務是檢查緩存的失效及過時檢驗;
6、Nginx的編譯安裝
一、下載nginx源碼包,並將其解壓;
[root@zly ~]# lftp 172.16.0.1 lftp 172.16.0.1:~> cd pub/Sources/sources/nginx/ lftp 172.16.0.1:/pub/Sources/sources/nginx> ls -rwxr--r-- 1 500 500 767688 Sep 13 01:49 nginx-1.4.2.tar.gz -rwxr--r-- 1 500 500 1415582 Sep 13 08:35 tengine-1.4.6.tar.gz -rwxr--r-- 1 500 500 1437781 Sep 13 08:35 tengine-1.5.1.tar.gz lftp 172.16.0.1:/pub/Sources/sources/nginx> get nginx-1.4.2.tar.gz 767688 bytes transferred lftp 172.16.0.1:/pub/Sources/sources/nginx> bye [root@zly ~]# ls anaconda-ks.cfg install.log install.log.syslog nginx-1.4.2.tar.gz [root@zly ~]# tar xf nginx-1.4.2.tar.gz [root@zly ~]# ls anaconda-ks.cfg install.log install.log.syslog nginx-1.4.2 nginx-1.4.2.tar.gz
二、解決編譯安裝時所依賴的關係;
[root@zly ~]# yum groupinstall "Development Tools" "Server Platform Deveopment" [root@zly ~]# yum -y install openssl-devel pcre-devel Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile .......... Installed: pcre-devel.x86_64 0:7.8-6.el6 Complete!
三、添加nginx用戶,並以之運行nginx服務;
[root@zly ~]# groupadd -r nginx [root@zly ~]# useradd -r -g nginx nginx [root@zly ~]# id nginx uid=496(nginx) gid=493(nginx) groups=493(nginx)
四、編譯安裝nginx;
[root@zly nginx-1.4.2]# ./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 [root@zly nginx-1.4.2]# make && make install
五、爲nginx服務提供Sysv init服務腳本
[root@zly nginx-1.4.2]# 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/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
六、將nginx加入服務列表中,並啓動nginx服務;
[root@zly nginx-1.4.2]# vim /etc/rc.d/init.d/nginx [root@zly nginx-1.4.2]# chmod +x /etc/rc.d/init.d/nginx [root@zly nginx-1.4.2]# chkconfig --add nginx [root@zly nginx-1.4.2]# chkconfig nginx on [root@zly nginx-1.4.2]# chkconfig --list nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@zly nginx-1.4.2]# service nginx start Starting nginx: [ OK ]
七、測試nginx服務,訪問相關http頁面。
7、Nginx的配置文件
/etc/nginx/nginx.conf
一、主要分兩段:全局配置段和http配置段
二、全局配置段:主要有user段和worker段
* 全局配置段示例
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; }
三、http配置段:http上下文四件套
http --> server --> location --> if
* http配置段示例
http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; }
四、HTTPS server段
# HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}
8、Nginx配置文件應用示例
Nginx 官方配置文檔http://nginx.org/en/
一、全局配置段在覈心模塊 Core functionality模塊上http://nginx.org/en/docs/ngx_core_module.html。
二、http配置段在 HTTP Core模塊。
三、server配置段在 HTTP Core模塊下的 server模塊。
四、location配置段在 HTTP Core模塊下的 location模塊。
五、實現服務訪問控制的配置在 Access模塊與Auth Basic模塊。
1)*實現基於虛擬主機ip的訪問控制
[root@ zly ~]# vim /etc/nginx/nginx.conf worker_processes 2; ........ events { worker_connections 1024; } ........ sendfile on; ........ keepalive_timeout 5; ........ server { listen 172.16.20.1:80; server_name localhost; root /web/vhost1; location / { root /web/vhost1; index index.html; } } server { listen 172.16.20.3:80; server_name xiaozheng; root /web/vhost2; [root@ zly ~]# mkdir -pv /web/{vhost1,vhost2} mkdir: created directory `/web' mkdir: created directory `/web/vhost1' mkdir: created directory `/web/vhost2' [root@ zly ~]# vim /web/vhost1/index.html <h1>Welcom to zly Host1</h1> [root@ zly ~]# vim /web/vhost2/index.html <h1> Welcom to new Host2</h1> [root@ zly ~]# ifconfig eth0:1 172.16.20.3 up [root@ zly ~]# ifconfig eth0:1 Link encap:Ethernet HWaddr 00:0C:29:38:7F:85 inet addr:172.16.20.3 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 [root@ zly ~]# service nginx restart nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Stopping nginx: [ OK ] Starting nginx: [ OK ] [root@ zly ~]# ss -tanlp | grep nginx LISTEN 0 128 172.16.20.3:80 *:* users:(("nginx",2628,7),("nginx",2629,7),("nginx",2630,7)) LISTEN 0 128 172.16.20.1:80 *:* users:(("nginx",2628,6),("nginx",2629,6),("nginx",2630,6))
訪問nginx頁面
注:同理基於虛擬主機名或虛擬主機端口,只須要在兩個server配置段定義不一樣的主機名或不一樣的虛擬主機端口
2)*實現nginx服務的Auth Basic訪問控制
[root@ zly ~]# useradd zly [root@ zly ~]# useradd xiaozheng [root@ zly ~]# htpasswd -c -m /etc/nginx/.htpasswd zly New password: Re-type new password: Adding password for user zly [root@ zly ~]# htpasswd -c -m /etc/nginx/.htpasswd xiaozheng New password: Re-type new password: Adding password for user xiaozheng [root@ zly ~]# vim /etc/nginx/nginx.conf server { listen 172.16.20.1:80; server_name localhost; root /web/vhost1; auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; location / { root /web/vhost1; index index.html; } } [root@ zly ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@ zly ~]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Reloading nginx: [ OK ]
六、實現自動索引文件 Auto Index模塊。
七、自定義響應報文首部配置在 Headers模塊上。
八、實現uri重寫的配置在Rewrite模塊上。