一、nginx使用分享
(一)nginx簡介
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,并在一個BSD-like協定下發行。Nginx的并發能力在同類型的Web伺服器中表現優異,國内主流無論大小網際網路公司都在用。
1.核心優勢
(1)高擴充性
Nginx的設計極具擴充性,它完全是由多個不同功能、不同層次、不同類型且耦合度極低的子產品組成。這種低耦合度的優秀設計,成就了Nginx龐大的第三方子產品,能滿足幾乎各種需求,而且還支援開源定制擴充子產品,極具靈活性。
(2)高可靠性
Web伺服器高可靠性是生命線,而Nginx的可靠性是有目共睹的,很多家高流量網站都在核心伺服器上大規模使用Nginx。Nginx的高可靠性來自于其核心架構代碼的優秀設計、子產品設計的簡單性;另外,官方提供的常用子產品都非常穩定,每個worker程序相對獨立,master程序在1個worker程序出錯時可以快速“拉起”新的worker子程序提供服務
(3)記憶體消耗少
記憶體消耗少: 在3萬并發連接配接下,開啟10個nginx程序僅消耗150M記憶體 (15M×10=150M),這是Nginx支援高并發連接配接的基礎。
(4)高并發連接配接: 官方稱單節點支援5萬并發連接配接數,實際生産環境能夠承受2-3萬并發。
(5)熱部署
master管理程序與worker工作程序的分離設計,使得Nginx能夠提供熱部署功能,即可以在7×24小時不間斷服務的前提下,更新Nginx的可執行檔案,還支援不停止服務就更新配置項、更換日志檔案等功能。
(6)配置簡單
(二)nginx能幹什麼
1.正,反向代理
所謂“代理”,是指在内網邊緣 設定一個硬體/軟體轉發請求;
“正向”還是“反向”的說法,取決于轉發的是"出站請求"還是"入站請求"。
正向代理:處理來自用戶端的出站請求,将其轉發到Internet,然後将生成的響應傳回給用戶端。和反向代理不同之處在于,典型的正向代理是一種最終使用者知道并主動使用的代理方式。
反向代理:處理來自Internet的入站請求,将其轉發給後端工作程式,然後将響應傳回給Internet。

正向代理和反向代理 在代理的方向上不同,但都會代理處理HTTP請求/響應。
代理伺服器存在的目的:
堡壘機/隔離内網: 内網用戶端無法通路外網需要設定堡壘機、隐藏内網工作伺服器
代理伺服器附加功能: 對流量執行操作、使用緩存或壓縮來提高性能、防禦攻擊并過濾資訊
2.負載均衡
負載均衡一般伴随着反向代理, 起到了 配置設定流量、透明代理、 增強容錯的效果
3.動靜分離
動靜分離與現在火熱的前後端分離概念火熱相關,前端可以自行開發、測試,自行使用nginx形成靜态資源伺服器,後端服務僅作為附加資源。
(三)nginx基礎配置
nginx的主配置檔案預設在/etc/nginx,檔案名為nginx.conf,一般的應用配置不要放在這裡,這裡隻配置一些公用的屬性,比如開啟壓縮、日志目錄、逾時時間等,不同應用的配置一般放在/etc/nginx/conf.d目錄下,針對不同的子產品建立不同的配置檔案,命名規則為“子產品名.conf”。
(四)nginx的https配置
1.基本服務配置
server{ listen 433; ssl on; server_name localhost; ssl_certificate .../server.pem; #指定證書位址 ssl_certificate_key .../server.key; #指定私鑰位址 ssl_client_certificate .../ca.crt; #指定ca證書 ssl_verify_depth 1; #設定用戶端證書鍊中的驗證深度。 ssl_session_timeout 5m; #指定用戶端可以重用會話參數的時間 ssl_verify_client on; #認證用戶端 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#協定 ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_prefer_server_ciphers on;#指定使用SSLv3和TLS協定時,伺服器密碼應優先于用戶端密碼。 location /{ ... #省略具體代理配置 } } |
根據安全級别,選擇加密套件
https://wiki.mozilla.org/Security/Server_Side_TLS注:因為較高的加密算法需要較新的用戶端支援,為了相容客戶需求可以加上較低版本的加密算法,但是在用戶端滿足要求時建議使用最高版本加密協定,以增強安全性
根據wiki上的說明可以知道,TLSv1.2需要用戶端滿足以下要求:Firefox 27, Chrome 30, IE 11 on Windows 7, Edge, Opera 17, Safari 9, Android 5.0, and Java 8.
如果客戶機器太多老舊,比如說xp系統和ie6浏覽器,那我們就需要使用SSLv3。
2.獲得client證書
在項目中,有時需要在服務端驗證用戶端的證書資訊,這就需要nginx能将用戶端的證書資訊轉到背景服務。
nginx不是在程序内加載module來運作php或者java,而是通過代理的方式将HTTP請求轉交給PHP或者Java程序,是以nginx是通過HTTP頭的方式将用戶端的證書資訊交給Java。
其中的$ssl_client_s_dn是nginx的内置變量,代表用戶端證書的主題名,它支援的所有變量詳見:
http://nginx.org/en/docs/http/ngx_http_ssl_module.htmljava等應用層代碼中,可以通過擷取http的頭部資訊來取得用戶端的證書資訊:
參考連結如下:
http://stackoverflow.com/questions/11840873/how-to-proxy-http-x-ssl-client-s-dn-header(五)nginx負載均衡
負載均衡:建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的靈活性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,進而共同完成工作任務。
由于請求量、資料量較大,單台伺服器不能扛住壓力,可能造成伺服器當機,就需要擴充伺服器,為了使多台伺服器均攤壓力,使每台機器上的壓力減小不至于當機,就需要使用負載均衡來實作。
1.負載均衡政策
Nginx 提供輪詢(round robin)、IP 哈希(client IP)和權重輪詢 3 種方式,預設情況下,Nginx 采用的是輪詢。
(1)輪詢(預設)
每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstream backserver { server 192.168.1.14; server 192.168.1.15; } |
(2)權重輪詢詢
指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的情況。
upstream backserver { server 192.168.1.14 weight=1; server 192.168.1.15 weight=2; |
(3)ip_hash
每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
ip_hash; server 192.168.0.14; server 192.168.0.15; |
2.重試政策
可以為每個 backserver 指定最大的重試次數,和重試時間間隔,所使用的關鍵字是 max_fails 和 fail_timeout。
server 192.168.1.14 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.15 weight=2 max_fails=2 fail_timeout=30s; |
失敗重試次數為3,且逾時時間為30秒。
3.熱機政策
當所有的非備機(non-backup)都當機(down)或者繁忙(busy)的時候,就會使用由 backup 标注的備機。必須要注意的是,backup 不能和 ip_hash 關鍵字一起使用。
upstream backserver { server 192.168.1.15 weight=2 max_fails=2 fail_timeout=30s; server 192.168.1.16 backup; |
(六)實用功能
1.通過端口支援同一域名下多個webapp。
2.綁定Https證書。
upstream receiver_server { server receiver:80; } upstream app_server { server app:80; server { listen 443 ssl http2; server_name taobao.com; ssl_certificate /server.crt; ssl_certificate_key /server.key; location / { proxy_pass http://receiver_server/; } listen 8080 ssl http2; server_name taobao.com:8080; proxy_pass http://app_server/; |
3.支援rewrite重寫規則: 能夠根據域名、url的不同,将http請求分發到後端不同的應用伺服器節點上。
4.内置健康檢查功能: 如果後端的某台應用節點挂了,請求不會再轉發給這個節點,不影響線上功能。
關鍵指令: max_fails, fail_timeout
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; |
5.節省帶寬: 支援gzip壓縮。
6.解決跨域問題① 反向代理 ② 增加CORS響應頭
在前後端分離項目,對跨域請求增加CORS響應頭、對靜态資源開啟gzip壓縮
location / { gzip on; gzip_types application/javascript text/css image/jpeg; root /usr/share/nginx/html; index index.html index.htm; try_files $uri /index.html; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'Content-Type'; add_header 'Access-Control-Allow-Credentials' 'true'; |
(七)nginx常用指令
1.啟動nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx ##也可通過service指令 [root@localhost ~]# sevice nginx start |
2.停止nginx
[root@localhost sbin]# nginx -s stop [root@localhost ~]# sevice nginx stop ##優雅關閉nginx(不接受新的連接配接請求,等待舊的連接配接請求處理完畢再關閉) [root@songguoliang sbin]# nginx -s quit |
3.重新加載配置檔案
[root@localhost sbin]# nginx -s reload |
注:當系統有更新時,盡量不要使用重新開機nginx的方式來重新加載配置檔案,因為重新開機會造成一定時間的服務不可用,很不友好,盡量使用重新加載的指令來實作無縫更新。
4.測試配置檔案
[root@localhost sbin]# nginx -t |
(八)nginx日志分析
nginx的日志檔案預設存放在/var/log/nginx/目錄下(根據nginx.conf配置可能不同)。
nginx的log日志分為access log 和 error log。
其中access log 記錄了哪些使用者,哪些頁面以及使用者浏覽器、ip和其他的通路資訊
error log 則是記錄伺服器錯誤日志,形式如下:
其中包含了請求時間、錯誤原因、用戶端位址、伺服器位址、請求類型(GET、POST)、http協定版本、伺服器ip和端口、錯誤來源頁面(檔案)。當頁面異常是可以通過error日志來快速的找到問題所在