Nginx的工作原理和配置詳解

餘二五發表於2017-11-08

一、Nginx簡介

Nginx (pronounced engine-x) is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. Igor Sysoevstarted development of Nginx in 2002, with the first public release in 2004. Nginx now hosts nearly12.18% (22.2M) of active sites across all domains. Nginx is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.

Nginx是一款免費的、開源的、高效能的HTTP伺服器、反向代理伺服器、郵件代理伺服器。是由俄羅斯人Igor Sysoev人在2002研發成功的,2004年釋出第一版公共穩定版。到目前為止,Ngnix市場所佔額是12.18%。Nginx以它的高效能,穩定性,豐富特性(第三方模組的支援),配置簡單和較低的資源消耗著稱。

Nginx的工作流程:

Nginx會按需同時執行多個程式:一個主程式(master)和幾個工作程式(worker),配置了快取時還會有快取載入器程式(cache loader)和快取管理器程式(cache manager)等。所有程式均是僅含有一個執行緒,並主要通過“共享記憶體”的機制實現程式間通訊。主程式以root使用者身份執行,而worker、cache loader和cache manager均應以非特權使用者身份執行。

主程式主要完成如下工作:

1. 讀取並驗正配置資訊;

2. 建立、繫結及關閉套接字;

3. 啟動、終止及維護worker程式的個數;

4. 無須中止服務而重新配置工作特性;

5. 控制非中斷式程式升級,啟用新的二進位制程式並在需要時回滾至老版本;

6. 重新開啟日誌檔案,實現日誌滾動;

7. 編譯嵌入式perl指令碼;

worker程式主要完成的任務包括:

1. 接收、傳入並處理來自客戶端的連線;

2. 提供反向代理及過濾功能;

3. nginx任何能完成的其它任務;

cache loader程式主要完成的任務包括:

1. 檢查快取儲存中的快取物件;

2. 使用快取後設資料建立記憶體資料庫;

cache manager程式的主要任務:

1. 快取的失效及過期檢驗;

具體,更詳細的內容參照官網:nginx.org

二、安裝配置nginx

安裝:

說明: 這裡所使用的作業系統型別,CentOS 6.5

rpm方式裝:

下載官方製作好的rpm包,直接安裝。下載地址:http://nginx.org/packages/

原始碼安裝:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1、解決依賴關係
 
# yum groupinstall "Development Tools" "Server Platform Deveopment" -y
yum install openssl-devel pcre-devel -y
 
2、安裝
 
首先新增使用者nginx,實現以之執行nginx服務程式:
# groupadd -r nginx
# useradd -r -g nginx nginx
 
接著開始編譯和安裝:
# ./configure 
  --prefix=/usr/local/nginx    -----> Nginx的安裝目錄
  --error-log-path=/data/applogs/nginx/error.log    -----> Nginx的錯誤日誌
  --http-log-path=/data/applogs/nginx/access.log    -----> Ngnix的訪問日誌
  --pid-path=/var/run/nginx/nginx.pid      -----> Nginx的pid檔案
  --lock-path=/var/lock/nginx.lock  -----> Nginx鎖檔案位置
  --user=nginx  -----> Nginx程式執行時的使用者
  --group=nginx     -----> Nginx程式執行時的組
  --with-http_ssl_module    -----> 新增 SSL 模組
  --with-http_flv_module    -----> 新增 flv 格式的模組
  --with-http_stub_status_module    -----> 新增 stub_status 模組
  --with-http_gzip_static_module    -----> 新增 gzip_static 模組
  --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/   -----> fastcgi位置 (php)
  --http-uwsgi-temp-path=/usr/local/nginx/uwsgi     -----> uwsgi位置 (python)
  --http-scgi-temp-path=/usr/local/nginx/scgi       -----> scgi配置的位置
  --with-pcre -----> 支援pcre
 
# make && make install

配置:

說明:這裡使用的安裝方式是rmp安裝方式。

安裝的節點:172.16.10.77

1

配置檔案簡單說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Nginx的配置有著幾個不同的上下文:main、http、server、upstream和location(還有實現郵件服務
反向代理的mail)。
配置語法的格式和定義方式遵循所謂的C風格,因此支援巢狀,還有著邏輯清晰並易於建立、閱讀和維
護等優勢。
 
 
Nginx的程式碼是由一個核心和一系列的模組組成, 核心主要用於提供Web Server的基本功能,以及Web
  和Mail反向代理的功能;
還用於啟用網路協議,建立必要的執行時環境以及確保不同的模組之間平滑地進行互動。不過,大多
  跟協議相關的功能和某應用特有的功能都是由nginx的模組實現的。
這些功能模組大致可以分為事件模組、階段性處理器、輸出過濾器、變數處理器、協議、upstream和
  負載均衡幾個類別,這些共同組成了nginx的http功能。
事件模組主要用於提供OS獨立的(不同作業系統的事件機制有所不同)事件通知機制如kqueue或epoll等
  
協議模組則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。
 
在nginx內部,程式間的通訊是通過模組的pipeline或chain實現的;
換句話說,每一個功能或操作都由一個模組來實現。例如,壓縮、通過FastCGI或uwsgi協議與
   upstream伺服器通訊,以及與memcached建立會話等。

1、nginx提供web服務

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@localhost nginx]# cat nginx.conf
user  nginx;  
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    use epoll;
    worker_connections  1024;
}
 
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
 
    sendfile        on;
 
    keepalive_timeout  65;
    server {
                listen 80;
                add_header X-Via $server_addr;
                server_name www.example.com;
                location / {
                        root /usr/share/nginx/html;
                        index  index.html index.htm;
            rewrite ^/imgs/(.*)$ /images/$1 break;  # 重寫url
                }
 
                location /status {
                        stub_status on;
                }
        # 設定使用者認證,認證檔案需要使用htpasswd命令生成
                location /admin {
                        index index.html;
                        root /usr/share/nginx/html;
                        auth_basic           "admin pass";
                        auth_basic_user_file /etc/nginx/htpasswd;
                }
 
                location /bbs {
                        proxy_pass http://172.16.10.16/;
                }
    }
 
 
    include /etc/nginx/conf.d/*.conf;
}

結果示例:

2

4

5

6

7

8

2、nginx反向代理、提供快取

Nginx的反向代理是由proxy模組實現的。結合upstream模組實現簡單的負載均衡。

詳細資訊參考:http://wiki.nginx.org/Modules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@localhost nginx]# cat nginx.conf
user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    use epoll;
    worker_connections  1024;
}
 
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
 
    sendfile        on;
 
    keepalive_timeout  65;
    proxy_cache_path /data/cache  levels=1:2   keys_zone=web:10m max_size=512m;
    upstream web {
        #ip_hash;
        server 172.16.10.11:80; 
        server 172.16.10.9:80;
        server 172.16.10.16:80 weight=1;     
        server 172.16.10.77:8080 backup;     
    }
    server {
        listen 80;
        add_header X-Via $server_addr;
        add_header X-Cache-Status $upstream_cache_status;
        server_name www.example.com;
        location / {
            root /usr/share/nginx/html;
            proxy_pass http://web;
                proxy_cache web;
                proxy_cache_valid 200 1d;
                proxy_cache_valid 301 302 10m;
                proxy_cache_valid any 1m;
                index  index.html index.htm;
            if ($request_method ~* "PUT") {
                proxy_pass http://172.16.10.11;
                break;
            }
        }
     
   }
 
    include /etc/nginx/conf.d/*.conf;
}


結果展示:

如果沒有快取資料,會根據排程演算法排程到後端的real server.

10

12

4、nginx的FastCgi工作模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 在對應的server段新增以下,就可實現 fastcgi 代理
 
location ~ .php$ {
                        root /php;
                        fastcgi_pass 172.16.10.11:9000;
                        fastcgi_index index.php;
                        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                        include        fastcgi_params;
}
 
[root@localhost nginx]# cat fastcgi_params
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
 
# 在172.16.10.11上配置好,php-fpm環境
yum install php-fpm
  
配置監聽埠: /etc/php-fpm.d/www.conf 
listen = 172.16.10.11:9000
允許訪問埠:註釋表示any
;listen.allowed_clients = 127.0.0.1
 
mkdir /php
vim /php/index.php
<?php
phpinfo();
?>
 
啟動php-fpm

結果展示:

22

21

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1558304,如需轉載請自行聯絡原作者


相關文章