天天看點

nginx使用分享一、nginx使用分享

一、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。

nginx使用分享一、nginx使用分享

正向代理和反向代理 在代理的方向上不同,但都會代理處理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。

nginx使用分享一、nginx使用分享

其中的$ssl_client_s_dn是nginx的内置變量,代表用戶端證書的主題名,它支援的所有變量詳見:

http://nginx.org/en/docs/http/ngx_http_ssl_module.html

java等應用層代碼中,可以通過擷取http的頭部資訊來取得用戶端的證書資訊:

 參考連結如下:

http://stackoverflow.com/questions/11840873/how-to-proxy-http-x-ssl-client-s-dn-header

(五)nginx負載均衡

負載均衡:建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的靈活性和可用性。

負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,進而共同完成工作任務。

由于請求量、資料量較大,單台伺服器不能扛住壓力,可能造成伺服器當機,就需要擴充伺服器,為了使多台伺服器均攤壓力,使每台機器上的壓力減小不至于當機,就需要使用負載均衡來實作。

nginx使用分享一、nginx使用分享

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 則是記錄伺服器錯誤日志,形式如下:

nginx使用分享一、nginx使用分享

其中包含了請求時間、錯誤原因、用戶端位址、伺服器位址、請求類型(GET、POST)、http協定版本、伺服器ip和端口、錯誤來源頁面(檔案)。當頁面異常是可以通過error日志來快速的找到問題所在