深入淺出Nginx實戰與架構
本文主要內容如下(讓讀者朋友們深入淺出地理解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官方網站:
//nginx.org/en/
Nginx官方文檔:
//nginx.org/en/docs/contributing_changes.html
Nginx源代碼:
//github.com/nginx/nginx
如果大家覺得英文方面閱讀方面有一些困難,不用擔心。一方面可以藉助Google翻譯或其它翻譯工具降低閱讀困難,另外一方面可藉助國內內容網站所包含的豐富內容(如博客園、知乎、掘金、51CTO、思否、CSDN等這樣的)。
除此之外,Nginx的商業化解決方案可供一些朋友參考,Nginx的商業網站:
//www.nginx.com/
六、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 //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下載地址):
//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架構,明確架構核心、啟動流程、源代碼目錄的含義等(讀者朋友可根據自己需要進行查閱相關資料並深入學習實踐等)。