nginx入門
一、簡介
Nginx (engine x) 是一個高效能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。2018年08月28日釋出1.15.3版本。
其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。
二、功能概述
1、HTTP基礎功能:
處理靜態檔案,索引檔案以及自動索引;
反向代理加速(無快取),簡單的負載均衡和容錯;
FastCGI,簡單的負載均衡和容錯;
模組化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
SSL 和 TLS SNI 支援;
2、IMAP/POP3 代理服務功能:
使用外部 HTTP 認證伺服器重定向使用者到 IMAP/POP3 後端;
使用外部 HTTP 認證伺服器認證使用者後連線重定向到內部的 SMTP 後端;
認證方法:
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
IMAP: IMAP LOGIN;
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
SSL 支援;
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支援;
3、支援的作業系統:
FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
MacOS X (10.4) PPC;
4、結構與擴充套件:
一個主程序和多個工作程序。工作程序是單執行緒的,且不需要特殊授權即可執行;
kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支援;
kqueue支援的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效資料的數目,錯誤程式碼;
sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支援;
輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支援;
10,000 非活動的 HTTP keep-alive 連線僅需要 2.5M 記憶體。
最小化的資料拷貝操作;
5、其他HTTP功能:
基於IP 和名稱的虛擬主機服務;
Memcached 的 GET 介面;
支援 keep-alive 和管道連線;
靈活簡單的配置;
重新配置和線上升級而無須中斷客戶的工作程序;
可定製的訪問日誌,日誌寫入快取,以及快捷的日誌回捲;
4xx-5xx 錯誤程式碼重定向;
基於 PCRE 的 rewrite 重寫模組;
基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;
PUT, DELETE, 和 MKCOL 方法;
支援 FLV (Flash 視訊);
頻寬限制;
三、安裝與啟動
命令:
yum install -y gcc gcc-c++pcre pcre-devel zlib zlib-devel # 安裝依賴 cd /usr/local/src wget http://nginx.org/download/nginx-1.15.3.tar.gz # 下載原始碼 tar -xvzf nginx-1.15.3.tar.gz cd nginx-1.15.3 ./configure --prefix=/usr/local/nginx make && make install #編譯、安裝
啟動:/usr/local/nginx/sbin/nginx
測試配置檔案:/usr/local/nginx/sbin/nginx –t
重啟:/usr/local/nginx/sbin/nginx -s reopen
重新載入配置檔案:/usr/local/nginx/sbin/nginx -s reload
快速關閉:/usr/local/nginx/sbin/nginx -s stop
優雅關閉:/usr/local/nginx/sbin/nginx -s quit
訪問:
http://192.168.141.130/
四、配置示例
1)、反向代理
正向代理-轉發代理(forward proxy):
反向代理(reverse proxy):
配置:
server { listen80; server_namefxdl.test.com; location /fxdl { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.141.130:8080/fxdl; } }
2)、動靜分離
配置:
server { listen80; server_namedjfl.test.com; location ^~ /static/ { alias /usr/local/nginx/djfl/; break; } location /djfl { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.141.130:8080/djfl; } }
3)、負載均衡
配置:
upstream fzjh { server 192.168.141.130:8080; server 192.168.141.130:9090; } server { listen80; server_namefzjh.test.com; location ^~ /static/ { alias /usr/local/nginx/fzjh/; break; } location /fzjh { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://fzjh/fzjh; } }
負載均衡演算法:
Nginx的upstream目前支援以下幾種方式的分配
(1)、輪詢(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
(2)、weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
(3)、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
(4)、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
(5)、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。
4)、FastCGI
FastCGI是一個可伸縮地、高速地在HTTP伺服器和動態指令碼語言間通訊的介面(FastCGI介面在Linux下是socket(可以是檔案socket,也可以是ip socket)),主要優點是把動態語言和HTTP伺服器分離開來。多數流行的HTTP伺服器都支援FastCGI,包括Apache、Nginx和lightpd。
同時,FastCGI也被許多指令碼語言所支援,比較流行的指令碼語言之一為PHP。FastCGI介面方式採用C/S架構,可以將HTTP伺服器和指令碼解析伺服器分開,同時在指令碼解析伺服器上啟動一個或多個指令碼解析守護程序。當HTTP伺服器每次遇到動態程式時,可以將其直接交付給FastCGI程序執行,然後將得到的結構返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態指令碼伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的效能。
FastCGI的重要特點:
1、FastCGI是HTTP伺服器和動態指令碼語言間通訊的介面或者工具。
2、FastCGI優點是把動態語言解析和HTTP伺服器分離開來。
3、Nginx、Apache、Lighttpd以及多數動態語言都支援FastCGI。
4、FastCGI介面方式採用C/S架構,分為客戶端(HTTP伺服器)和服務端(動態語言解析伺服器)。
5、PHP動態語言服務端可以啟動多個FastCGI的守護程序。
6、HTTP伺服器通過FastCGI客戶端和動態語言FastCGI服務端通訊。
Nginx FastCGI的執行原理
Nginx不支援對外部動態程式的直接呼叫或者解析,所有的外部程式(包括PHP)必須通過FastCGI介面來呼叫。FastCGI介面在Linux下是socket(可以是檔案socket,也可以是ip socket)。為了呼叫CGI程式,還需要一個FastCGI的wrapper,這個wrapper繫結在某個固定socket上,如埠或者檔案socket。當Nginx將CGI請求傳送給這個socket的時候,通過FastCGI介面,wrapper接收到請求,然後派生出一個新的執行緒,這個執行緒呼叫直譯器或者外部程式處理指令碼並讀取返回資料;接著,wrapper再將返回的資料通過FastCGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的資料傳送給客戶端,這就是Nginx+FastCGI的整個運作過程。
FastCGI的主要優點是把動態語言和HTTP伺服器分離開來,是Nginx專一處理靜態請求和向後轉發動態請求,而PHP/PHP-FPM伺服器專一解析PHP動態請求。
5)、rewrite
看下面兩張圖:
配置:
server { listen80; server_nameold.test.com; rewrite ^(.*)$http://new.test.com$1 permanent; #return 301 http://new.test.com$request_uri; } server { listen80; server_namenew.test.com; location / { roothtml; indexindex.html index.htm; } }
五、nginx和apache httpd伺服器的對比
server |
Apache |
Nginx |
Proxy代理 |
非常好 |
非常好 |
Rewriter |
好 |
非常好 |
Fcgi |
不好 |
好 |
熱部署 |
不支援 |
支援 |
系統壓力比較 |
很大 |
很小 |
穩定性 |
好 |
非常好 |
安全性 |
好 |
一般 |
技術支援 |
非常好 |
很少 |
靜態檔案處理 |
一般 |
非常好 |
Vhosts虛擬主機 |
支援 |
不支援 |
反向代理 |
一般 |
非常好 |
Session sticky |
支援 |
不支援 |
Apache和Nginx比較
功能對比
Nginx和Apache一樣,都是HTTP伺服器軟體,在功能實現上都採用模組化結構設計,都支援通用的語言介面,如PHP、Perl、Python等,同時還支援正向和反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸等。
- 在功能實現上,Apache的所有模組都支援動、靜態編譯,而Nginx模組都是靜態編譯的,
- 對FastCGI的支援,Apache對Fcgi的支援不好,而Nginx對Fcgi的支援非常好;
- 在處理連線方式上,Nginx支援epoll,而Apache卻不支援;
- 在空間使用上,Nginx安裝包僅僅只有幾百K,和Nginx比起來Apache絕對是龐然大物。
Nginx相對apache的優點
- 輕量級,同樣起web 服務,比apache 佔用更少的記憶體及資源
- 靜態處理,Nginx 靜態處理效能比 Apache 高 3倍以上
- 抗併發,nginx 處理請求是非同步非阻塞的,而apache則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能。在Apache+PHP(prefork)模式下,如果PHP處理慢或者前端壓力很大的情況下,很容易出現Apache程序數飆升,從而拒絕服務的現象。
- 高度模組化的設計,編寫模組相對簡單
- 社群活躍,各種高效能模組出品迅速啊
apache相對nginx的優點
- rewrite,比nginx 的rewrite 強大
- 模組超多,基本想到的都可以找到
- 少bug,nginx的bug相對較多
- 超穩定
- Apache對PHP支援比較簡單,Nginx需要配合其他後端用
選擇Nginx的優勢所在
- 作為Web伺服器: Nginx處理靜態檔案、索引檔案,自動索引的效率非常高。
- 作為代理伺服器,Nginx可以實現無快取的反向代理加速,提高網站執行速度。
- 作為負載均衡伺服器,Nginx既可以在內部直接支援Rails和PHP,也可以支援HTTP代理伺服器對外進行服務,同時還支援簡單的容錯和利用演算法進行負載均衡。
- 在效能方面,Nginx是專門為效能優化而開發的,在實現上非常注重效率。它採用核心Poll模型(epoll and kqueue ),可以支援更多的併發連線,最大可以支援對50 000個併發連線數的響應,而且只佔用很低的記憶體資源。
- 在穩定性方面,Nginx採取了分階段資源分配技術,使得CPU與記憶體的佔用率非常低。Nginx官方表示,Nginx保持10 000個沒有活動的連線,而這些連線只佔用2.5MB記憶體,因此,類似DOS這樣的攻擊對Nginx來說基本上是沒有任何作用的。
- 在高可用性方面,Nginx支援熱部署,啟動速度特別迅速,因此可以在不間斷服務的情況下,對軟體版本或者配置進行升級,即使執行數月也無需重新啟動,幾乎可以做到7×24小時不間斷地執行。
同時使用Nginx和Apache
由於Nginx和Apache各自的優勢,現在很多人選擇了讓兩者在伺服器中共存。在伺服器端讓Nginx在前,Apache在後。由Nginx做負載均衡和反向代理,並且處理靜態檔案,講動態請求(如PHP應用)交給Apache去處理。