天天看點

Nginx常用經典配置|反向代理、HTTPS重定向、端口轉發

作者:區塊軟體開發
Nginx常用經典配置|反向代理、HTTPS重定向、端口轉發

二級目錄映射

目前前後端項目分離場景多了以後,一般是前端一個端口,後端一個端口。

如前端是https://example.com/index.html,調用的接口是https://example.com:4433

如此部署對于一些小項目未免有些麻煩,當然你在公網環境下也可以選擇使用子域名、其他域名進行跨域通路。

這裡說的是同一個域名,同一個端口,讓前後端同時進行通路服務。

前端位址:https://example.com/index.html

接口位址:https://example.com/api/

這裡先記錄我已經測試通過的反向代理的方式,即不改變原本的server配置。直接通過反向代理将example.com/api 重定向到 example.com:4443/

location ^~ /api/ {
    proxy_pass  https://example.com:4433/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}           

nginx

Copy

值得一提的是,location段的^~是代表某個字元作為開頭比對,這裡就是以/api/作為開頭進行比對URL規則。

這裡不能寫作~,因為~是正則比對的意思,用了正則就不能再proxy_pass段配置URI了,所謂URI就是4433端口後面的/。

如果不寫/,當通路example.com/api/index.php時,會代理到example.com:4433/api/index.php。并不能定位到後端的根路徑,是以這裡以/結束。

非标準HTTPS端口重定向

如果想讓你的非标準https端口,如2083支援HTTP跳轉HTTPS通路,請參照如下配置。

error_page 497 https://$host:2083$request_uri;           

nginx

Copy

如果不這麼配置,預設當使用者不确定網站協定時,采用了HTTP協定通路你的HTTPS網站就會出現無法通路。

錯誤如:The plain HTTP request was sent to HTTPS port

HTTP強制跳轉HTTPS

日常為了保證訪客安全性,我們常常需要讓全站保持HTTPS通路,那麼你可以通過以下配置。

server {
        listen 80 default_server;
        server_name example.com;
        rewrite ^(.*) https://$server_name$1 permanent;
        #上面的rewrite也可以寫作
        return 301 https://$host$request_uri;
}
server {
        listen 443 ssl;
        server_name example.com;
}           

Bash

Copy

做法是,讓80監聽到的HTTP連結全部重定向到HTTPS端口中。

HSTS政策保持HTTPS連接配接

與此同時,你也可以通過開啟HSTS政策強制讓訪客浏覽器保持使用HTTPS連結,添加如下代碼:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;           

nginx

Copy

  • max-age:設定機關時間(秒)内強制使用 HTTPS 連接配接,這裡為1年
  • includeSubDomains:可選,站點所有子域同時生效
  • preload:可選,非規範值,用于定義使用『HSTS 預加載清單』
  • always:可選,保證所有響應都發送此響應頭,包括各種內置錯誤響應

Nginx反向代理

反向代理的場景很多,例如前面的前後端統一域名端口,例如負載均衡等。

location / {
    proxy_pass  http://example.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}           

nginx

Copy

完整參數配置

location / {
    proxy_pass  http://example.com;
    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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_max_temp_file_size 0;
    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
}           

nginx

Copy

端口轉發

Nginx端口轉發性能也非常強大,可以用于内網資料庫、其他服務端口外露的場景。

如将内網的192.168.1.2MySQL資料庫端口通過Nginx所在伺服器的33062端口進行外露。

upstream TCP3306 {
    hash $remote_addr consistent;
    server 192.168.1.2:3306;
}

server {
    listen 33062;
    proxy_connect_timeout 5s;
    proxy_timeout 300s;
    proxy_pass TCP3306;
}           

nginx

Copy

限制通路IP

可以通過 ngx_http_access_module 允許限制某些IP位址的通路。

比如僅允許内網 IP 通路管理背景頁面。

location /admin {
    allow 192.168.1.0/24;
    allow 10.0.0.0/24;
    deny all;
}           

nginx

Copy

其中的 192.168.1.0/24 和 10.0.0.0/24 皆為允許通路的 IP。預設從上而下依次比對規則,如果比對不中前面的内網IP,則預設命中最後的拒絕通路。

過濾請求類型

如果你已經明确知道你的網站隻有 GET、POST、HEAD 這三種請求,其他請求完全用不到,則可以通過如下方式直接屏蔽掉。

if($request_method !~ ^(GET|HEAD|POST)$) {
    return404;
}           

nginx

Copy

Timeout設定

有時候,為了優化一些網站性能,可以将逾時時間設定低一些,來降低死連結。

http {

    client_body_timeout 10;
    client_header_timeout 30;
    keepalive_timeout 30 30;
    send_timeout 10;

}           

Bash

Copy

關閉Nginx版本号

當使用者請求傳回資料中不包含具體的nginx版本号,避免一些版本漏洞被猜解。

server_tokens off;           

繼續閱讀