深入淺出Nginx實戰與架構

2022-05-29 18:03:41

本文主要內容如下(讓讀者朋友們深入淺出地理解Nginx,有程式碼有範例有圖):

  • 1.Nginx是什麼?
  • 2.Nginx具有哪些功能?
  • 3.Nginx的應用場景有哪些?
  • 4.Nginx的衍生生態有哪些?
  • 5.Nginx開源相關資料有哪些?
  • 6.Nginx怎麼樣安裝?
  • 7.Nginx常用的設定包含哪些?以及是怎麼設定的?
  • 8.Nginx的安全策略需要從哪些方面考慮?
  • 9.Nginx架構是怎樣的?
  • 10.總結

一、Nginx是什麼?

Nginx是一款免費開源的高效能HTTP伺服器及反向代理伺服器產品。

二、Nginx具有哪些功能?

  • 1.正向代理與反向代理。
  • 2.負載均衡。
  • 3.Web快取。
  • 4.動靜分離。

三、Nginx的應用場景有哪些?

從我個人的實踐經驗出發,我用Nginx做了這麼幾件事情,如下所示:

  • 1.個人網站(如YC-Framework官網就是放在Nginx對應的目錄下)或者是公司官網。
  • 2.外部閘道器代理(內部網路關用SpringCloud Gateway,外部閘道器用Nginx)。
  • 3.基於Nginx+FTP的檔案服務搭建。
  • 4.Nginx代理後端服務叢集(負載均衡機制的體現)。
  • 5.基於Nginx Basic認證控制系統存取許可權。
  • 6.內網對映代理。
  • 7.設定https。
  • 8.黑白名單。

四、Nginx的衍生生態有哪些?

衍生生態比較出名的一個叫Openresty。Openresty是一款基於 Nginx和LuaJIT的Web平臺,它既具有Nginx擁有的功能,同時由於大量精良的Lua庫,使其更加靈活,能構造出很多玩法。一句話概括,功能更強大了。

關於Openresty安裝可以閱讀我的這篇文章:
OpenResty原始碼編譯安裝

五、Nginx開源相關資料有哪些?

Nginx官方網站:
https://nginx.org/en/

Nginx官方檔案:
http://nginx.org/en/docs/contributing_changes.html

Nginx原始碼:
https://github.com/nginx/nginx

如果大家覺得英文方面閱讀方面有一些困難,不用擔心。一方面可以藉助Google翻譯或其它翻譯工具降低閱讀困難,另外一方面可藉助國內內容網站所包含的豐富內容(如部落格園、知乎、掘金、51CTO、思否、CSDN等這樣的)。

除此之外,Nginx的商業化解決方案可供一些朋友參考,Nginx的商業網站:
https://www.nginx.com/

六、Nginx怎麼樣安裝?

過去我寫了不少文章,可供大家參考:

Windows安裝Nginx

Centos7之Java開發環境構建(包含Nginx安裝)

Ubuntu16.04之開發環境構建(包含Nginx安裝)

七、Nginx常用的設定包含哪些?以及是怎麼設定的?

1.Nginx怎樣設定HTTPS?

server {
        listen       443 ssl;
       
        server_name  framework.youcongtech.com;
       
        ssl_certificate /home/tech/7788450_framework.youcongtech.com.pem;
        ssl_certificate_key /home/tech/7788450_framework.youcongtech.com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            try_files $uri $uri/ /index.html;
            root /home/tech/project/yc-framework-docs;
            index  index.html index.htm;
           # root   html;
           # index  index.html index.htm;
        }
    }

  

 

這個是我官網的證書設定,大家可存取分散式微服務架構:YC-Framework官網檢視效果。

2.Nginx開啟SSL以後如何將HTTP重定向到HTTPS呢?

YC-Framework官網採用的是第二種方法。

(1)第一種方法

server {
    listen 80;
    server_name localhost;
    return 301 https://127.0.0.1$request_uri;
}

 

(2)第二種方法

server {
    listen 80;
    server_name localhost;
    rewrite ^(.*)$ https://$host$1 permanent;
}

 

(3)Nginx如何設定靜態資源對映?

location /img/ {
   alias /home/tech/img/;
   autoindex on;
}

(4)Nginx如何代理內部伺服器某個中介軟體(如MySQL)?

stream {
    upstream inner_mysql {
       hash $remote_addr consistent;
       server 192.168.1.188:3389 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
       listen 17865; # 資料庫伺服器監聽埠
       proxy_connect_timeout 60s;
       proxy_timeout 300s; # 設定使用者端和代理服務之間的超時時間,如果5分鐘內沒操作將自動斷開。
       proxy_pass inner_mysql;
    }
}

(5)Nginx如何設定跨域?

#允許跨域請求的域,* 代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許請求的header
add_header 'Access-Control-Allow-Headers' *;
#允許帶上cookie請求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請求的方法,比如 GET,POST,PUT,DELETE
add_header 'Access-Control-Allow-Methods' *;

  

(6)Nginx如何設定限制連線?

location / {
	root   /var/www/test;
	index  index.php index.html index.htm;
	limit_conn addr 5; #是限制每個IP只能發起5個連線
}

  

(7)Nginx如何設定限制下載速度?

location /download { 
       limit_rate_after 10m; 
       limit_rate 128k; 
 }

(8)Nginx如何限制IP存取?

# 允許部分ip存取
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
 # 禁止其餘ip存取
deny all;

該設定可放server和location中。

(9)Nginx如何設定HTTP Basic認證?

location /
{
    auth_basic "網站名稱";
    auth_basic_user_file conf.d/passwd; 
    autoindex on;
}

  

詳情可閱讀這篇文章為 Nginx 新增 HTTP 基本認證(HTTP Basic Authentication)

(10)Nginx如何設定超時時間?

proxy_send_timeout 90; #後端伺服器資料回傳時間(代理傳送超時)
proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)

 

(11)Nginx請求體過大怎麼辦?

這種場景通常出現在Nginx代理後端服務中。問題的報錯資訊如下:

413 Request Entity Too Large

解決辦法設定如下即可:

client_max_body_size 20m;

(12)Nginx如何設定負載均衡?

Nginx負載均衡有六種策略,分別是輪詢、權重、ip_hash、最少連線、fair、url_hash等)。

(1)輪詢策略

upstream  backup-server {
   server    192.168.1.101:8080; 
   server    192.168.1.102:8080;
}

(2)權重策略

upstream  backup-server {
   server    192.168.1.101:8080 weigh=5; 
   server    192.168.1.102:8080 weigh=6;
}

(3)ip_hash策略

upstream  backup-server {
   ip_hash;
   server    192.168.1.101:8080 weigh=5; 
   server    192.168.1.102:8080 weigh=6;
}

(4)最少連線策略

upstream  backup-server {
   least_conn;
   server    192.168.1.101:8080 weigh=5; 
   server    192.168.1.102:8080 weigh=6;
}

  

(5)fair策略

upstream  backup-server {
   server    192.168.1.101:8080; 
   server    192.168.1.102:8080;
   fair;
}

 

(6)url_hash策略

upstream  backup-server {
   hash $request_uri; 
   server    192.168.1.101:8080; 
   server    192.168.1.102:8080;
}

  

八、Nginx的安全策略需要從哪些方面考慮?

1.隱藏Nginx版本資訊,防止對應的攻擊者通過版本漏洞來攻擊

server_tokens off;

  

2.限制HTTP請求方式

HTTP請求一共有九種,分別為GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。

這裡我僅僅只允許GET與POST:

if ($request_method !~ ^(GET|POST)$ ) {
    return 404;
}

3.自定義Nginx快取

proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的設定
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳

4.過濾非法USER-AGENT(簡稱UA)

if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
    return 403;
}

5.過濾不支援URL

location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
    rewrite ^/(.*)$  $host  permanent;
}

6.強制域名存取(必須開啟SSL保護)

if ( $host !~* 'youcongtech.com' ) {
    return 403;
}

  

7.使用者降低許可權

user nginx www;

  

8.禁止目錄瀏覽

autoindex off;

9.限制檔案上傳大小

client_max_body_size 18m

  

10.關注Nginx所使用版本的漏洞情況,並適時更新

關於Nginx相關版本資訊可存取如下網址獲取(Nginx下載地址):
https://nginx.org/en/download.html

當然了,這僅僅是從Nginx的安全形度出發,光從Nginx出發只能在一定程度上保障Nginx本身的安全,還是得從伺服器層面乃至制度層面入手。伺服器層面我曾寫過一些文章,可供讀者朋友參考:
伺服器安全策略之思考與實踐

九、Nginx架構是怎樣的?

1.Nginx架構設計的核心主要包含哪些方面?

 

 

 

由圖可知,架構設計的核心主要體現如下:

  • (1)模組化設計。
  • (2)代理設計。
  • (3)事件驅動模型。
  • (4)主程序模型。
  • (5)工作程序模型。

2.Nginx啟動流程是怎樣的?

 

 

 

3.Nginx原始碼對應的目錄是什麼意思?

Nginx原始碼目錄為如下:

- core (該目錄存放core module的程式碼,也是nginx服務的入口)
- event (nginx 自身對事件處理邏輯的封裝)
- http (http core module 的程式碼,nginx作為web/http proxy server執行時的核心模組)
- mail (mail core module 的程式碼,nginx作為pop3/imap/smtp proxy server執行時的核心模組)
- misc (nginx 的一些utils,定義了test和profiler的一些外圍模組的邏輯)
- os (nginx對各個平臺抽象邏輯的封裝)
- stream (nginx用來實現四層協定的轉發、代理和負載均衡)

十、總結

光憑這一篇文章很難深入到Nginx的各種細節當中,不過此文章著重體現兩個方面,第一個方面是Nginx各種設定範例(基本來源於我個人架構生涯中的Nginx實戰),第二個方面總覽Nginx架構,明確架構核心、啟動流程、原始碼目錄的含義等(讀者朋友可根據自己需要進行查閱相關資料並深入學習實踐等)。