深入淺出 Nginx 實戰與架構原理
本文主要內容如下 (讓讀者朋友們深入淺出地理解 Nginx,有代碼有示例有圖):
-
1.Nginx 是什麼?
-
2.Nginx 具有哪些功能?
-
3.Nginx 的應用場景有哪些?
-
4.Nginx 的衍生生態有哪些?
-
5.Nginx 開源相關資料有哪些?
-
6.Nginx 怎麼樣安裝?
-
7.Nginx 常用的配置包含哪些?以及是怎麼配置的?
-
8.Nginx 的安全策略需要從哪些方面考慮?
-
9.Nginx 架構是怎樣的?
-
- 總結
一、Nginx 是什麼?
Nginx 是一款免費開源的高性能 HTTP 服務器及反向代理服務器產品。
二、Nginx 具有哪些功能?
-
- 正向代理與反向代理。
-
- 負載均衡。
-
3.Web 緩存。
-
- 動靜分離。
三、Nginx 的應用場景有哪些?
從我個人的實踐經驗出發,我用 Nginx 做了這麼幾件事情,如下所示:
-
- 個人網站 (如 YC-Framework 官網就是放在 Nginx 對應的目錄下) 或者是公司官網。
-
- 外部網關代理 (內部網關用 SpringCloud Gateway,外部網關用 Nginx)。
-
- 基於 Nginx+FTP 的文件服務搭建。
-
4.Nginx 代理後端服務集羣 (負載均衡機制的體現)。
-
- 基於 Nginx Basic 認證控制系統訪問權限。
-
- 內網映射代理。
-
- 配置 https。
-
- 黑白名單。
四、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 怎麼樣安裝?
過去我寫了不少文章,可供大家參考:
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 呢?
採用的是第二種方法。
(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