天天看點

Nginx的工作原理和配置詳解

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

Nginx會按需同時運作多個程序:一個主程序(master)和幾個工作程序(worker),配置了緩存時還會有緩存加載器程序(cache loader)和緩存管理器程序(cache manager)等。所有程序均是僅含有一個線程,并主要通過“共享記憶體”的機制實作程序間通信。主程序以root使用者身份運作,而worker、cache loader和cache manager均應以非特權使用者身份運作。

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

2. 建立、綁定及關閉套接字;

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

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

5. 控制非中斷式程式更新,啟用新的二進制程式并在需要時復原至老版本;

6. 重新打開日志檔案,實作日志滾動;

7. 編譯嵌入式perl腳本;

1. 接收、傳入并處理來自用戶端的連接配接;

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

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

1. 檢查緩存存儲中的緩存對象;

2. 使用緩存中繼資料建立記憶體資料庫;

1. 緩存的失效及過期檢驗;

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

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

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

<code>1、解決依賴關系</code>

<code># yum groupinstall "Development Tools" "Server Platform Deveopment" -y</code>

<code>yum </code><code>install</code> <code>openssl-devel pcre-devel -y</code>

<code>2、安裝</code>

<code>首先添加使用者nginx,實作以之運作nginx服務程序:</code>

<code># groupadd -r nginx</code>

<code># useradd -r -g nginx nginx</code>

<code>接着開始編譯和安裝:</code>

<code># ./configure \</code>

<code>  </code><code>--prefix=</code><code>/usr/local/nginx</code> <code>\   -----&gt; Nginx的安裝目錄</code>

<code>  </code><code>--error-log-path=</code><code>/data/applogs/nginx/error</code><code>.log \   -----&gt; Nginx的錯誤日志</code>

<code>  </code><code>--http-log-path=</code><code>/data/applogs/nginx/access</code><code>.log \   -----&gt; Ngnix的通路日志</code>

<code>  </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid  \    -----&gt; Nginx的pid檔案</code>

<code>  </code><code>--lock-path=</code><code>/var/lock/nginx</code><code>.lock \ -----&gt; Nginx鎖檔案位置</code>

<code>  </code><code>--user=nginx \ -----&gt; Nginx程序運作時的使用者</code>

<code>  </code><code>--group=nginx \    -----&gt; Nginx程序運作時的組</code>

<code>  </code><code>--with-http_ssl_module \   -----&gt; 添加 SSL 子產品</code>

<code>  </code><code>--with-http_flv_module \   -----&gt; 添加 flv 格式的子產品</code>

<code>  </code><code>--with-http_stub_status_module \   -----&gt; 添加 stub_status 子產品</code>

<code>  </code><code>--with-http_gzip_static_module \   -----&gt; 添加 gzip_static 子產品</code>

<code>  </code><code>--http-client-body-temp-path=</code><code>/usr/local/nginx/client/</code> <code>\    -----&gt; 用戶端實體存放位置</code>

<code>  </code><code>--http-proxy-temp-path=</code><code>/usr/local/nginx/proxy/</code> <code>\   -----&gt; 代理配置目錄</code>

<code>  </code><code>--http-fastcgi-temp-path=</code><code>/usr/local/nginx/fcgi/</code> <code>\  -----&gt; fastcgi位置 (php)</code>

<code>  </code><code>--http-uwsgi-temp-path=</code><code>/usr/local/nginx/uwsgi</code> <code>\    -----&gt; uwsgi位置 (python)</code>

<code>  </code><code>--http-scgi-temp-path=</code><code>/usr/local/nginx/scgi</code> <code>\      -----&gt; scgi配置的位置</code>

<code>  </code><code>--with-pcre -----&gt; 支援pcre</code>

<code># make &amp;&amp; make install</code>

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

安裝的節點:172.16.10.77

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663464PcS2.png" target="_blank"></a>

<code>Nginx的配置有着幾個不同的上下文:main、http、server、upstream和location(還有實作郵件服務</code>

<code>反向代理的mail)。</code>

<code>配置文法的格式和定義方式遵循所謂的C風格,是以支援嵌套,還有着邏輯清晰并易于建立、閱讀和維</code>

<code>護等優勢。</code>

<code>Nginx的代碼是由一個核心和一系列的子產品組成, 核心主要用于提供Web Server的基本功能,以及Web</code>

<code>  </code><code>和Mail反向代理的功能;</code>

<code>還用于啟用網絡協定,建立必要的運作時環境以及確定不同的子產品之間平滑地進行互動。不過,大多</code>

<code>  </code><code>跟協定相關的功能和某應用特有的功能都是由nginx的子產品實作的。</code>

<code>這些功能子產品大緻可以分為事件子產品、階段性處理器、輸出過濾器、變量處理器、協定、upstream和</code>

<code>  </code><code>負載均衡幾個類别,這些共同組成了nginx的http功能。</code>

<code>事件子產品主要用于提供OS獨立的(不同作業系統的事件機制有所不同)事件通知機制如kqueue或epoll等</code>

<code>  </code><code>。</code>

<code>協定子產品則負責實作nginx通過http、tls</code><code>/ssl</code><code>、smtp、pop3以及imap與對應的用戶端建立會話。</code>

<code>在nginx内部,程序間的通信是通過子產品的pipeline或chain實作的;</code>

<code>換句話說,每一個功能或操作都由一個子產品來實作。例如,壓縮、通過FastCGI或uwsgi協定與</code>

<code>   </code><code>upstream伺服器通信,以及與memcached建立會話等。</code>

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<code>[root@localhost nginx]</code><code># cat nginx.conf</code>

<code>user  nginx;  </code>

<code>worker_processes  1;</code>

<code>error_log  </code><code>/var/log/nginx/error</code><code>.log warn;</code>

<code>pid        </code><code>/var/run/nginx</code><code>.pid;</code>

<code>events {</code>

<code>    </code><code>use epoll;</code>

<code>    </code><code>worker_connections  1024;</code>

<code>}</code>

<code>http {</code>

<code>    </code><code>include       </code><code>/etc/nginx/mime</code><code>.types;</code>

<code>    </code><code>default_type  application</code><code>/octet-stream</code><code>;</code>

<code>    </code><code>log_format  main  </code><code>'$remote_addr - $remote_user [$time_local] "$request" '</code>

<code>                      </code><code>'$status $body_bytes_sent "$http_referer" '</code>

<code>                      </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>

<code>    </code><code>access_log  </code><code>/var/log/nginx/access</code><code>.log  main;</code>

<code>    </code><code>sendfile        on;</code>

<code>    </code><code>keepalive_timeout  65;</code>

<code>    </code><code>server {</code>

<code>                </code><code>listen 80;</code>

<code>                </code><code>add_header X-Via $server_addr;</code>

<code>                </code><code>server_name www.example.com;</code>

<code>                </code><code>location / {</code>

<code>                        </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>

<code>                        </code><code>index  index.html index.htm;</code>

<code>            </code><code>rewrite ^</code><code>/imgs/</code><code>(.*)$ </code><code>/images/</code><code>$1 </code><code>break</code><code>;  </code><code># 重寫url</code>

<code>                </code><code>}</code>

<code>                </code><code>location </code><code>/status</code> <code>{</code>

<code>                        </code><code>stub_status on;</code>

<code>        </code><code># 設定使用者認證,認證檔案需要使用htpasswd指令生成</code>

<code>                </code><code>location </code><code>/admin</code> <code>{</code>

<code>                        </code><code>index index.html;</code>

<code>                        </code><code>auth_basic           </code><code>"admin pass"</code><code>;</code>

<code>                        </code><code>auth_basic_user_file </code><code>/etc/nginx/htpasswd</code><code>;</code>

<code>                </code><code>location </code><code>/bbs</code> <code>{</code>

<code>                        </code><code>proxy_pass http:</code><code>//172</code><code>.16.10.16/;</code>

<code>    </code><code>}</code>

<code>    </code><code>include </code><code>/etc/nginx/conf</code><code>.d/*.conf;</code>

結果示例:

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_14116634705Ifz.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663475L9Pj.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663477h582.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663478Tiks.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663479UPOh.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663480GNku.png" target="_blank"></a>

Nginx的反向代理是由proxy子產品實作的。結合upstream子產品實作簡單的負載均衡。

56

57

<code>user  nginx;</code>

<code>    </code><code>proxy_cache_path </code><code>/data/cache</code>  <code>levels=1:2   keys_zone=web:10m max_size=512m;</code>

<code>    </code><code>upstream web {</code>

<code>        </code><code>#ip_hash;</code>

<code>        </code><code>server 172.16.10.11:80; </code>

<code>        </code><code>server 172.16.10.9:80;</code>

<code>        </code><code>server 172.16.10.16:80 weight=1;     </code>

<code>        </code><code>server 172.16.10.77:8080 backup;     </code>

<code>        </code><code>listen 80;</code>

<code>        </code><code>add_header X-Via $server_addr;</code>

<code>        </code><code>add_header X-Cache-Status $upstream_cache_status;</code>

<code>        </code><code>server_name www.example.com;</code>

<code>        </code><code>location / {</code>

<code>            </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>

<code>            </code><code>proxy_pass http:</code><code>//web</code><code>;</code>

<code>                </code><code>proxy_cache web;</code>

<code>                </code><code>proxy_cache_valid 200 1d;</code>

<code>                </code><code>proxy_cache_valid 301 302 10m;</code>

<code>                </code><code>proxy_cache_valid any 1m;</code>

<code>                </code><code>index  index.html index.htm;</code>

<code>            </code><code>if</code> <code>($request_method ~* </code><code>"PUT"</code><code>) {</code>

<code>                </code><code>proxy_pass http:</code><code>//172</code><code>.16.10.11;</code>

<code>                </code><code>break</code><code>;</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>    </code> 

<code>   </code><code>}</code>

結果展示:

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

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_141166348186hZ.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_14116634854Ub5.png" target="_blank"></a>

<code># 在對應的server段添加以下,就可實作 fastcgi 代理</code>

<code>location ~ \.php$ {</code>

<code>                        </code><code>root </code><code>/php</code><code>;</code>

<code>                        </code><code>fastcgi_pass 172.16.10.11:9000;</code>

<code>                        </code><code>fastcgi_index index.php;</code>

<code>                        </code><code>fastcgi_param  SCRIPT_FILENAME  </code><code>/scripts</code><code>$fastcgi_script_name;</code>

<code>                        </code><code>include        fastcgi_params;</code>

<code>[root@localhost nginx]</code><code># cat fastcgi_params</code>

<code>fastcgi_param  GATEWAY_INTERFACE  CGI</code><code>/1</code><code>.1;</code>

<code>fastcgi_param  SERVER_SOFTWARE    nginx;</code>

<code>fastcgi_param  QUERY_STRING       $query_string;</code>

<code>fastcgi_param  REQUEST_METHOD     $request_method;</code>

<code>fastcgi_param  CONTENT_TYPE       $content_type;</code>

<code>fastcgi_param  CONTENT_LENGTH     $content_length;</code>

<code>fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;</code>

<code>fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;</code>

<code>fastcgi_param  REQUEST_URI        $request_uri;</code>

<code>fastcgi_param  DOCUMENT_URI       $document_uri;</code>

<code>fastcgi_param  DOCUMENT_ROOT      $document_root;</code>

<code>fastcgi_param  SERVER_PROTOCOL    $server_protocol;</code>

<code>fastcgi_param  REMOTE_ADDR        $remote_addr;</code>

<code>fastcgi_param  REMOTE_PORT        $remote_port;</code>

<code>fastcgi_param  SERVER_ADDR        $server_addr;</code>

<code>fastcgi_param  SERVER_PORT        $server_port;</code>

<code>fastcgi_param  SERVER_NAME        $server_name;</code>

<code># 在172.16.10.11上配置好,php-fpm環境</code>

<code>yum </code><code>install</code> <code>php-fpm</code>

<code> </code> 

<code>配置監聽端口: </code><code>/etc/php-fpm</code><code>.d</code><code>/www</code><code>.conf </code>

<code>listen = 172.16.10.11:9000</code>

<code>允許通路端口:注釋表示any</code>

<code>;listen.allowed_clients = 127.0.0.1</code>

<code>mkdir</code> <code>/php</code>

<code>vim </code><code>/php/index</code><code>.php</code>

<code>&lt;?php</code>

<code>phpinfo();</code>

<code>?&gt;</code>

<code>啟動php-fpm</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663488bDP9.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663490OsKx.png" target="_blank"></a>

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