關於如何快速調教NGINX的幾點總結

羅摩爾發表於2019-04-10

關於如何快速調教Nginx的幾點總結

關於Nginx的好與壞,我覺得沒有必要去介紹了,在這裡主要分享一下我在實際的專案部署中是如何快速的調教Nginx的。其中分享的原始碼大家可以作為模板程式碼,根據自身專案的實際情況,酌情使用。

這裡簡單的說一說我為什麼要寫這篇文章,網上有很多大而全的文章在介紹Nginx是什麼,如何入門等等,玩了很多的文字遊戲,反正我接觸Nginx的時候,去查閱文件給我的是這種感覺,大而全,但是很亂。這裡我要講的不是Nginx的理論知識,而是一些能夠快速的應用到專案中的實際技巧。廢話就說這麼多,開始本次分享的主體。

調教一:開啟GZIP,提高頁面載入速度

http:{
    ...
    
    gzip on;
    gzip_min_length 10;
    gzip_comp_level 4;
    gzip_disable "MSIE [1-10] \.";
    gzip_types text/plain appliaton/x-javascript text/css application/xml image/jpeg image/gif image/png image/svg+xml;
    
    ...
}
複製程式碼
gzip on 開啟gzip壓縮功能
gzip_min_lenght 10 壓縮臨界值,大於10KB的檔案才壓縮
gzip_com_level 4 設定壓縮級別[0-10],數字越大,壓縮比越好,但消耗的時間越長
gzip_desable "MSIE [1-10]." 對IE瀏覽器不採用壓縮,[1-10]表示瀏覽器版本範圍
gzip_types 需要進行檔案壓縮的型別,根據自身情況酌情新增

一般情況下,關於gzip的配置,設定以上幾個引數就可以了

調教二:無www的域名跳轉到帶www的域名

server{
    listen 80;
    server_name http://youdomain.com;
    return 301 http://www.youdomain.com$request_uri;
}
複製程式碼

針對自己的域名,配置一個全域性的server,對裸域名的請求進行轉發,注意要加上“$request_uri”

網上有關這個問題提供了另外一種解決辦法,程式碼如下:

server{
    listen 80;
    server_name www.youdomain.com;
    if ( $host !='www.youdomain.com'){
        rewrite ^/(.*)$ http://www.youdomain.com/$1 permanent;
    }
    rewrite ^/(.*)$ http://$host$1 permanent;
}
複製程式碼

我在自己的專案中使用第二種方式進行配置,貌似沒有生效,所以改為了第一種配置方式

調教三:配置https

關於如何配置server(http)這裡不再介紹,網上相關文件很多,這裡主要分享如何在Nginx中配置HTTPS,配置程式碼如下:

server{
    listen 443 ssl;
    server_name www.youdomain.com;
    access_log logs/com_youdomain_logs.log;
    
    ssl_certificate  c:/sslfile/cert.crt;
    ssl_certificate_key c:/sslfile/cert.key;
    
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    
    location /{
    	proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    Host  $host;
        proxy_set_header    X-Forwarded-Proto   https;
        proxy_set_header    X-real-IP  $remote_addr;
        proxy_set_header    X-Forwarded-proto  $scheme;            
        proxy_connect_timeout   240;
        proxy_send_timeout    240;
        proxy_read_timeout    240;
        proxy_pass    http://localhost:8080;
        proxy_redirect ~^http://([^:]+)(:\d+)?(.*)$ https://$1$3;    
    }
}
複製程式碼

這裡需要注意幾個地方:

  • 監聽的埠由原來的80或者其他(通常是80埠)改為 443 ssl 。
  • ssl_certificate配置HTTPS證照放置的路徑,ssl_certificate_key 放置HTTPS證照的祕鑰路徑。
  • ssl_session_cache配置HTTPS的快取,ssl_session_timeout配置HTTPS快取的生命週期。
  • 在location配置中,proxy_set_header部分的程式碼是一個固定用法,不進行介紹。
  • proxy_connect_timeout,proxy_send_timeout和proxy_read_timeout主要配置在HTTPS下建立請求連線、傳送資料和讀取資料的時間上線(超時處理)
  • proxy_pass設定Nginx需要代理的請求物件,如http://localhost:8080 ,這裡需要web容器配置,在接下來會單獨介紹
  • proxy_redirect設定代理後的請求轉發重定向:~^http://([^:]+)(:\d+)?(.*)$ https://$1$3; 將http請求重定向到https上。

要實現https加密請求,還需要web容器的配合,在這裡以Apache Tomcat配置為例進行介紹。

調教三:開啟tomcat對https請求的支援

在上一小節中,我們對server的代理做了如下的配置:

server{
    ...
    location /{
        ...
        proxy_pass http://localhost:8080;
        ...
    }
    ...
}
複製程式碼

首先,我們需要將tomcat的聯結器(Connector)的埠設定為8080,將轉發重定向的埠(redirectPort)和代理埠(proxyPort)設定為443。具體的配置程式碼如下:

...
<Connector prot="8080" protocol="HTTP/1.1" connectionTimeout="20000"
           redirectPort="443" proxyPort="443"/>
...
複製程式碼

然後,需要在Host配置中設定remoteIpHeaderprotocolHeaderprotocolHeaderHttpsValue這三個屬性的值,詳細配置如下:

...

	<Host name="localhost" appBase="webapps" ....>
		<Value className="org.apache.catalina.values.RemoteIpValue"
               remoteIpHeader="X-Forwarded-For"
               protocolHeader="X-Forwarded-Proto"
               protocolHeaderHttpsValue="https"/>
		...
        ...
        <Context docBase="" path="" reloadable="false"></Context>
	
	</Host>

...
複製程式碼

以上就是就是Nginx+tomcat的組合方式開啟https請求的調教過程。

作者:譚朝紅
原文:關於如何快速調教NGINX的幾點總結

結束語

以上就是我在實際專案開發過程中任務比較常用其重要的幾個調教點,希望本次分享能夠幫到你。此次文章主要分享關於Nginx小而精的一些常用配置技巧,更多的配置如分散式下一服多例項的配置我會單獨些一篇文章進行分享,今天的內容就到這裡結束了;再次感謝你的拜讀,拜拜~~

相關文章