Nginx的基礎原理及基本配置(一)

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

093725263.jpg

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頁面。

165554343.jpg

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

211553328.jpg

二、http配置段在 HTTP Core模塊。

211609325.jpg

三、server配置段在 HTTP Core模塊下的 server模塊。

211631704.jpg

四、location配置段在 HTTP Core模塊下的 location模塊。

211647405.jpg

五、實現服務訪問控制的配置在 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頁面

215908146.jpg

215908398.jpg

注:同理基於虛擬主機名或虛擬主機端口,只須要在兩個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  ]

222343795.jpg

六、實現自動索引文件 Auto Index模塊。

七、自定義響應報文首部配置在 Headers模塊上。

八、實現uri重寫的配置在Rewrite模塊上。

相關文章
相關標籤/搜索