一. Nginx的簡介
1. 什麼是nginx
- Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲“engine X”, 是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。Nginx是由俄羅斯人 Igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發的,它已經在該站點運行超過兩年半了。Igor Sysoev在建立的項目時,使用基於BSD許可。自Nginx 發佈來,Nginx 已經因爲它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
2. Ninx的優點
1. 高併發連接:
官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2~3萬併發連接數。
2. 內存消耗少:
在3萬併發連接下,開啓的10個Nginx 進程才消耗150M內存(15M*10=150M)。
- 3. 配置文件非常簡單:
風格跟程序一樣通俗易懂。
- 4. 成本低廉:
Nginx爲開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣。
- 5. 支持Rewrite重寫規則:
能夠根據域名、URL的不同,將 HTTP 請求分到不同的後端服務器羣組。
- 6. 內置的健康檢查功能:
如果 Nginx Proxy 後端的某臺 Web 服務器宕機了,不會影響前端訪問。
- 7. 節省帶寬:
支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。
- 8. 穩定性高:
用於反向代理,宕機的概率微乎其微。
Nginx專爲性能優化而開發,性能是其最重要的考量,實現上非常注重效率 。它支持內 核Poll模型,能經受高負載的考驗,有報告表明能支持高達 50,000個併發連接數。 Nginx具有很高的穩定性,其它HTTP服務器當遇到訪問的峯值,或者有人惡意發起慢速連接時,也很可能會導致服務器物理內存耗盡頻繁交換,失去響應只能重啓服務器。例如當前Apache一旦上到200個以上進程,web響應速度就明顯非常緩慢了。而Nginx採取了分階段資源分配技術,使得它的CPU與內存佔用率非常低。Nginx官方表示保持 10,000個沒有活動的連接,它只佔2.5M內存,所以類似DOS這樣的攻擊對Nginx來說基本上是毫無用處的。就穩定性而言,nginx比lighttpd更勝一籌。 Nginx支持熱部署,它的啓動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運 行數個月也不需要重新啓動。你還能夠在不間斷服務的情況下,對軟件版本進行進行升級。 Nginx採用master-slave模型,能夠充分利用SMP的優勢,且能夠減少工作進程在磁 盤I/O的阻塞延遲。 Nginx代碼質量非常高,代碼很規範,手法成熟, 模塊擴展也很容易。 Nginx採用了一些os提供的最新特性如對sendfile (Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,從而大大提高了性 能。
二. Nginx的配置文件
1. Nginx的配置文件詳解
1.1 認識配置文件
Linux 下基本上每個服務都會有它的主配置文件,該文件會定義服務應該如果去運行,
使用些什麼參數,啓用些什麼功能,相關會涉及到的一些操作文件在哪,所以主配置文件對 服務是至關重要的。下面我們來分析一下 Nginx 的主配置文件。
Nginx的主配置文件默認情況下位於/usr/local/nginx/nginx.conf 以下爲Nginx
#指定使用的用戶
#user nobody;
#啓動進程,通常設置成和cpu的數量相等
worker_processes 1;
#全局錯誤日誌
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#PID文件--存放進程號的文件
#pid logs/nginx.pid;
#工作模式及連接數上限
events {
#單個後臺worker process進程的最大併發鏈接數
worker_connections 1024;
#併發總數是 worker_processes 和 worker_connections 的乘積
#Nginx支持如下處理連接的方法(I/O複用方法),這些方法可以通過 use指令指定。
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#use epoll; #使用 epoll(linux2.6的 性能方式 )
#select - 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數 –with-select_module 和 –without-select_module 來啓用或禁用這個模塊。
#poll - 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數–with-poll_module 和 –without-poll_module 來啓用或禁用這個模塊。
#kqueue - 效的方法,使用於 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的 MacOS X系統使用 kqueue可能會造成內核崩潰。
#epoll - 效的方法,使用於Linux內核2.6版本及以後的系統。在某些發行版本中,如 SuSE 8.2,有讓2.4版本的內核支持epoll的補丁。
#rtsig - 可執行的實時信號,使用於Linux內核版本 2.2.19以後的系統。可是從Linux內核版本2.6.6-mm2開始,這個參數就不再使用了.
#/dev/poll - 效的方法,使用於 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
#eventport - 效的方法,使用於 Solaris 10. 爲了防止出現內核崩潰的問題, 有必要安裝 這個 安全補丁。
}
http {
#設定mime類型,類型由mime.type文件定義
include 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"';
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,
#對於普通應用,必須設爲 on,
#如果用來進行下載等應用磁盤IO重負載應用,可設置爲 off,
#以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
#開啓gzip壓縮
#gzip on;
#設定虛擬主機配置
server {
#偵聽80端口
listen 80;
#定義使用 www.nginx.cn訪問
server_name localhost;
#定義服務器的默認網站根目錄位置
root html;
#設置編碼
#charset koi8-r;
#設定本虛擬主機的訪問日誌
#access_log logs/host.access.log main;
#默認請求
location / {
root html;
#定義首頁索引文件的名稱
index index.html index.htm;
}
# 定義錯誤提示頁面
#error_page 404 /404.html;
#redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#PHP腳本轉給apache處理
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#PHP 腳本請求全部轉發到 FastCGI處理. 使用FastCGI默認配置.
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 禁止訪問 .htxxx 文件
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
1.2 nginx的配置文件結構
- nginx.conf由多個塊組成,最外面的塊是main,main包含events和http,http包含多個upstream和多個server,server又包含多個location:
- main(全局設置)、server(虛擬主機設置)、upstream(負載均衡服務器設置)和 location(URL匹配特定位置的設置)。
- main塊設置的指令將影響其他所有設置;
- server塊的指令主要用於指定主機和端口;
- upstream指令主要用於負載均衡,設置一系列的後端服務器;
- location塊用於匹配網頁位置。
- 這四者之間的關係式:server繼承main,location繼承server,upstream既不會繼承其他設置也不會被繼承。
- 在這四個部分當中,每個部分都包含若干指令,這些指令主要包含Nginx的主模塊指令、事件模塊指令、HTTP核心模塊指令,同時每個部分還可以使用其他HTTP模塊指令,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等。
1.3 Nnginx的全局配置
#指定使用的用戶和組
#user nginx nginx;
#啓動進程,通常設置成和cpu的數量相等
worker_processes 1;
#全局錯誤日誌
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#PID文件--存放進程號的文件
#pid logs/nginx.pid;
創建全局配置中nginx需要的運行用戶
groupadd nginx
useradd -g nginx nginx
2. events配置
服務器爲linux時, 請講use epoll打開. 利用linux的內核提供性能優化方案
#工作模式及連接數上限
events {
#單個後臺worker process進程的最大併發鏈接數
worker_connections 1024;
#併發總數是 worker_processes 和 worker_connections 的乘積
#Nginx支持如下處理連接的方法(I/O複用方法),這些方法可以通過 use指令指定。
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll];
use epoll; #使用 epoll(linux2.6的 性能方式 )
}
3. http的配置
http {
#Nginx對HTTP服務器相關屬性的配置
include mime.types;
default_type application/octet-stream;
#設定虛擬主機配置
server {
#偵聽80端口
listen 80;
#定義使用 www.itsource.cn訪問
server_name www.itsource.cn;
location {
}
location {
}
…..
}
server {
#偵聽80端口
listen 80;
#定義使用 www.example.cn訪問
server_name www.example.cn;
location {
}
location {
}
…..
}
}
include是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少主配置文件的複雜度。類似於Apache中的include方法。
default_type屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP文件就會出現下載窗口。
server塊的指令主要用於指定主機和端口(虛擬主機);
location部分主要用於匹配網頁位置,設置不同的功能特徵. 比如:緩存,重定向等…
4. nginx重要指令之location
location部分主要用於匹配網頁位置,設置不同的功能特徵. 比如:緩存,重定向等…
實例:
- 有擴展名以.gif、.jpg、.jpeg、.png、.bmp、.swf結尾的靜態文件都交給nginx處理,而expires用來指定靜態文件的過期時間,這裏是30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /wwwroot/www.itsource.com;
expires 30d;
}
- upload和html下的所有文件都交給nginx來處理,當然,upload和html目錄包含在/web/wwwroot/www.itsource.cn目錄中
location ~ ^/(upload|html)/ {
root /web/wwwroot/www.itsource.com;
expires 30d;
}
- location是對此虛擬主機下動態網頁的過濾處理,也就是將所有以.php爲後綴的文件都交給本機的8080端口處理
location ~ .*.php$ {
index index.php;
proxy_pass http://localhost:8080;
}
location的語法:
~ #波浪線表示執行一個正則匹配,區分大小寫
~ #表示執行一個正則匹配,不區分大小寫*
^~ #^~表示普通字符匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄
= #進行普通字符精確匹配
location中可以接受一下的語法規則
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何請求,因爲所有請求都是以"/"開始
# 但是更長字符匹配或者正則表達式匹配會優先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開始的請求,並停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg結尾的請求.
# 但是所有 /images/ 目錄的請求將由 [Configuration C]處理.
[ configuration D ]
}
優先級:
=前綴的指令嚴格匹配這個查詢。如果找到,停止搜索。
所有剩下的常規字符串,最長的匹配。如果這個匹配使用^〜前綴,搜索停止。
正則表達式,在配置文件中定義的順序。
如果第3條規則產生匹配的話,結果被使用。否則,如同從第2條規則被使用。
請求URI例子:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
三. Nginx中的rewrite
1. 什麼是rewrite
Rewrite對稱URL Rewrite,即URL重寫,就是把傳入Web的請求重定向到其他URL的過程。URL Rewrite最常見的應用是URL僞靜態化,是將動態頁面顯示爲靜態頁面方式的一種技術。比如http://www.123.com/news/index.asp?id=123 使用URLRewrite 轉換後可以顯示爲 http://www.123.com/news/123.html
對於追求完美主義的網站設計師,就算是網頁的地址也希望看起來儘量簡潔明快。形如http://www.123.com/news/index.asp?id=123的網頁地址,自然是毫無美感可言,而用UrlRewrite技術,你可以輕鬆把它顯示爲 http://www.123.com/news/123.html。
理論上,搜索引擎更喜歡靜態頁面形式的網頁,搜索引擎對靜態頁面的評分一般要高於動態頁面。所以,UrlRewrite可以讓我們網站的網頁更容易被搜索引擎所收錄。
從安全角度上講,如果在url中暴露太多的參數,無疑會造成一定量的信息泄漏,可能會被一些黑客利用,對你的系統造成一定的破壞,所以靜態化的url地址可以給我們帶來更高的安全性。
2. rewrite的命令的作用域和優先級
- 作用域:server,location.
- rewrite指令可以寫在server和location中.
nginx rewrite指令執行順序:
執行server塊的rewrite指令(這裏的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
執行location匹配
執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件
例如:
四. Nginx的虛擬主機
1. 什麼是Nginx的虛擬主機
- 虛擬主機是用來映射網站目錄和網站代碼文件夾的關係.它可以通過server配置, 每個server表示一個虛擬機主機.
2. 標準的虛擬主機配置
http {
#默認的虛擬機主機
server {
listen 80 default;
server_name _ *;
access_log logs/default.access.log main;
location / {
index index.html;
root /var/www/default/htdocs;
}
}
#www.domain1.com對應的虛擬主機
server {
listen 80;
server_name www.domain1.com;
access_log logs/domain1.access.log main;
location / {
index index.html;
root /var/www/domain1.com/htdocs;
}
}
#www.domain2.com對應的虛擬主機
server {
listen 80;
server_name www.domain2.com;
access_log logs/domain2.access.log main;
location / {
index index.html;
root /var/www/domain2.com/htdocs;
}
}
}
3. 規劃虛擬主機的配置文件
以上全部配置在主配置文件中可能不小心修改掉配置文件導致nginx.conf文件出錯. 可以使用include指令將每個虛擬主機放在一個單獨的配置文件中.
將nginx服務器目錄結構設置爲:
nginx
nginx.conf
vhost
– www.domain1.com.conf
– www.domain2.com.conf
- 每個.conf結尾的文件中保存一個虛擬主機(server)的配置信息.在nginx.conf中通過include指令包含這些配置文件.
- 在nginx/config/nginx.conf中的配置:
http {
#默認的虛擬機主機
server {
listen 80 default;
server_name _ *;
access_log logs/default.access.log main;
location / {
index index.html;
root /var/www/default/htdocs;
}
}
include vhost/*.conf;
}
- 在nginx/config/vhost/www.domain1.com.conf中的配置:
server {
listen 80;
server_name www.domain1.com;
access_log logs/domain1.access.log main;
location / {
index index.html;
root /var/www/domain1.com/htdocs;
}
}
- 在nginx/config/vhost/www.domain2.com.conf中的配置:
server {
listen 80;
server_name www.domain2.com;
access_log logs/domain2.access.log main;
location / {
index index.html;
root /var/www/domain2.com/htdocs;
}
}
五. 動靜分離
- 當用戶請求js,css等靜態資源時有當前nginx服務器處理, 請求php動態腳本代碼時由其他的服務器處理(反向代理).
#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發佈目錄讀取。
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /data/www/wugk;
#expires定義用戶瀏覽器緩存的時間爲3天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力
expires 3d;
}
#動態頁面交給其他服務器處理
location ~ .*\.(php|jsp|cgi)?$
{
#發送給其他服務器處理
}
- 容量符號縮寫
k,K | 千字節 |
---|---|
m,M | 兆字節 |
- 時間符號縮寫
ms | 毫秒 |
---|---|
s | 秒 |
m | 分鐘 |
h | 小時 |
d | 日 |
w | 周 |
M | 一個月, 30天 |
y | 年, 365 天 |
六. Nginx的反向代理
1. 什麼是反向代理
- 反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連的 客戶端,此時代理服務器對外就表現爲一個服務器。
2. 明確兩個概念
- web前端服務器: 代理服務器可以作爲前端服務器處理靜態資源
- web後端服務器: web前端服務器無法處理的動態請求發送給後臺web服務器處理.
3. 特點
反向代理又稱爲Web服務器加速,是針對Web服務器提供加速功能的。它作爲代理
Cache,但並不針對瀏覽器用戶,而針對一臺或多臺特定Web服務器(這也是反向代理名
稱的由來)。代理服務器可以緩存一些web的頁面,降低了web服務器的訪問量,所以可
以降低web服務器的負載。web服務器同時處理的請求數少了,響應時間自然就快了。同
時代理服務器也存了一些頁面,可以直接返回給客戶端,加速客戶端瀏覽。
4. 反向代理的配置
- 當用戶放到php文件時,將該請求交給apache服務器處理php文件
server {
#偵聽192.168.8.x的80端口
listen 80;
server_name www.itsource.cn;
#對php後綴的進行請求
location ~ .*\.php$ {
#定義服務器的默認網站根目錄位置
root /root;
#定義首頁索引文件的名稱
index index.php index.html index.htm;
#請求轉向apache服務器,apache服務器運行在81端口上
proxy_pass http://localhost:81;
#以下是一些反向代理的配置可刪除.
proxy_redirect off;
#後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允許客戶端請求的最大單文件字節數
client_max_body_size 10m;
#緩衝區代理緩衝用戶端請求的最大字節數,
client_body_buffer_size 128k;
#nginx跟後端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
#連接成功後,後端服務器響應時間(代理接收超時)
proxy_read_timeout 90;
#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffer_size 4k;
#proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
proxy_buffers 4 32k;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
}
}
5. 可以將代理配置單獨放在一個配置文件中
- 存放代理配置的nginx/conf/proxy.conf: 其他的server虛擬主機都可以使用該配置.
#以下是一些反向代理的配置可刪除.
proxy_redirect off;
#後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允許客戶端請求的最大單文件字節數
client_max_body_size 10m;
#緩衝區代理緩衝用戶端請求的最大字節數,
client_body_buffer_size 128k;
#nginx跟後端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
#連接成功後,後端服務器響應時間(代理接收超時)
proxy_read_timeout 90;
#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffer_size 4k;
#proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
proxy_buffers 4 32k;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
- 使用代理配置文件:
server {
listen 80;
server_name www.itsource.cn;
#對php後綴的進行請求
location ~ .*\.php$ {
#定義服務器的默認網站根目錄位置
root /root;
#定義首頁索引文件的名稱
index index.php index.html index.htm;
#請求轉向apache服務器,apache服務器運行在81端口上
proxy_pass http://localhost:81;
#以下是一些反向代理的配置可刪除.
include proxy.conf;
}
}
七. Nginx的負載均衡
1. 什麼是負載均衡
- 後臺服務器組成了一個服務器集羣(多臺服務器). 有中間服務器(nginx)接受到請求分發給不同的服務器後臺. 該nginx就是一個負載均衡服務器.
2. 負載均衡的優點
- 分散後臺服務器的壓力
- 自動去掉掛掉的後臺服務器
- 緩存後臺服務器響應內容
3. 負載均衡的分配策略
- nginx 的 upstream目前支持 4 種方式的分配
a. 輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。b. weight
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。c. ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
d. fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
e. url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
4. 負載均衡配置
- 在http節點裏添加:
#定義負載均衡設備的 ip及設備狀態
upstream myServer {
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
[ip_hash | fair | url_hash]
}
- 在需要使用負載的server節點下添加
proxy_pass http://myServer;
- upstream 每個設備的狀態:
down 表示單前的server暫時不參與負載
weight 默認爲1.weight越大,負載的權重就越大。
max_fails :允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
fail_timeout:max_fails 次失敗後,暫停的時間。
backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。