深入淺出 Nginx 實戰與架構原理

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

一、Nginx 是什麼?

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

二、Nginx 具有哪些功能?

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

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

四、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 安裝)

【文章福利】另外小編還整理了一些 C++ 後端開發面試題,教學視頻,後端學習路線圖免費分享,需要的可以自行添加:學習交流羣點擊加入~ 羣文件共享

小編強力推薦 C++ 後端開發免費學習地址:C/C++Linux 服務器開發高級架構師 / C++ 後臺開發架構師​

​七、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 架構設計的核心主要包含哪些方面?

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 架構,明確架構核心、啓動流程、源代碼目錄的含義等 (讀者朋友可根據自己需要進行查閱相關資料並深入學習實踐等)。

參考資料

推薦一個零聲教育 C/C++ 後臺開發的免費公開課程,個人覺得老師講得不錯,分享給大家:C/C++ 後臺開發高級架構師,內容包括 Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK 等技術內容,立即學習

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://xie.infoq.cn/article/72cc968ec9edaf72c2180e67d