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>\ -----> Nginx的安裝目錄</code>
<code> </code><code>--error-log-path=</code><code>/data/applogs/nginx/error</code><code>.log \ -----> Nginx的錯誤日志</code>
<code> </code><code>--http-log-path=</code><code>/data/applogs/nginx/access</code><code>.log \ -----> Ngnix的通路日志</code>
<code> </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid \ -----> Nginx的pid檔案</code>
<code> </code><code>--lock-path=</code><code>/var/lock/nginx</code><code>.lock \ -----> Nginx鎖檔案位置</code>
<code> </code><code>--user=nginx \ -----> Nginx程序運作時的使用者</code>
<code> </code><code>--group=nginx \ -----> Nginx程序運作時的組</code>
<code> </code><code>--with-http_ssl_module \ -----> 添加 SSL 子產品</code>
<code> </code><code>--with-http_flv_module \ -----> 添加 flv 格式的子產品</code>
<code> </code><code>--with-http_stub_status_module \ -----> 添加 stub_status 子產品</code>
<code> </code><code>--with-http_gzip_static_module \ -----> 添加 gzip_static 子產品</code>
<code> </code><code>--http-client-body-temp-path=</code><code>/usr/local/nginx/client/</code> <code>\ -----> 用戶端實體存放位置</code>
<code> </code><code>--http-proxy-temp-path=</code><code>/usr/local/nginx/proxy/</code> <code>\ -----> 代理配置目錄</code>
<code> </code><code>--http-fastcgi-temp-path=</code><code>/usr/local/nginx/fcgi/</code> <code>\ -----> fastcgi位置 (php)</code>
<code> </code><code>--http-uwsgi-temp-path=</code><code>/usr/local/nginx/uwsgi</code> <code>\ -----> uwsgi位置 (python)</code>
<code> </code><code>--http-scgi-temp-path=</code><code>/usr/local/nginx/scgi</code> <code>\ -----> scgi配置的位置</code>
<code> </code><code>--with-pcre -----> 支援pcre</code>
<code># make && 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><?php</code>
<code>phpinfo();</code>
<code>?></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,如需轉載請自行聯系原作者