Nginx (engine x) 是一個高性能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。2018年08月28日發佈1.15.3版本。html
其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。前端
處理靜態文件,索引文件以及自動索引;nginx
反向代理加速(無緩存),簡單的負載均衡和容錯;c++
FastCGI,簡單的負載均衡和容錯;web
模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;算法
SSL 和 TLS SNI 支持;apache
使用外部 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 支持;
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;
一個主進程和多個工做進程。工做進程是單線程的,且不須要特殊受權便可運行;
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 內存。
最小化的數據拷貝操做;
基於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/
正向代理-轉發代理(forward proxy):
反向代理(reverse proxy):
配置:
server { listen 80; server_name fxdl.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; } }
配置:
server { listen 80; server_name djfl.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; } }
配置:
upstream fzjh { server 192.168.141.130:8080; server 192.168.141.130:9090; } server { listen 80; server_name fzjh.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定向到同一個後端服務器,後端服務器爲緩存時比較有效。
FastCGI是一個可伸縮地、高速地在HTTP服務器和動態腳本語言間通訊的接口(FastCGI接口在Linux下是socket(能夠是文件socket,也能夠是ip socket)),主要優勢是把動態語言和HTTP服務器分離開來。多數流行的HTTP服務器都支持FastCGI,包括Apache、Nginx和lightpd。
同時,FastCGI也被許多腳本語言所支持,比較流行的腳本語言之一爲PHP。FastCGI接口方式採用C/S架構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程執行,而後將獲得的結構返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。
FastCGI的重要特色:
一、FastCGI是HTTP服務器和動態腳本語言間通訊的接口或者工具。
二、FastCGI優勢是把動態語言解析和HTTP服務器分離開來。
三、Nginx、Apache、Lighttpd以及多數動態語言都支持FastCGI。
四、FastCGI接口方式採用C/S架構,分爲客戶端(HTTP服務器)和服務端(動態語言解析服務器)。
五、PHP動態語言服務端能夠啓動多個FastCGI的守護進程。
六、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動態請求。
看下面兩張圖:
配置:
server { listen 80; server_name old.test.com; rewrite ^(.*)$ http://new.test.com$1 permanent; #return 301 http://new.test.com$request_uri; } server { listen 80; server_name new.test.com; location / { root html; index index.html index.htm; } }
server |
Apache |
Nginx |
Proxy代理 |
很是好 |
很是好 |
Rewriter |
好 |
很是好 |
Fcgi |
很差 |
好 |
熱部署 |
不支持 |
支持 |
系統壓力比較 |
很大 |
很小 |
穩定性 |
好 |
很是好 |
安全性 |
好 |
通常 |
技術支持 |
很是好 |
不多 |
靜態文件處理 |
通常 |
很是好 |
Vhosts虛擬主機 |
支持 |
不支持 |
反向代理 |
通常 |
很是好 |
Session sticky |
支持 |
不支持 |
Nginx和Apache同樣,都是HTTP服務器軟件,在功能實現上都採用模塊化結構設計,都支持通用的語言接口,如PHP、Perl、Python等,同時還支持正向和反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸等。
因爲Nginx和Apache各自的優點,如今不少人選擇了讓二者在服務器中共存。在服務器端讓Nginx在前,Apache在後。由Nginx作負載均衡和反向代理,而且處理靜態文件,講動態請求(如PHP應用)交給Apache去處理。