一口氣看完,比自學強十倍!
![](https://news.xinpengboligang.com/upload/keji/709b1bd13b211273be4dd098da4c71ae.jpeg)
什麼是Nginx
Nginx是一個開源的高性能HTTP和反向代理服務器。它可以用於處理靜態資源、負載均衡、反向代理和緩存等任務。Nginx被廣泛用於構建高可用性、高性能的Web應用程序和網站。它具有低內存消耗、高並發能力和良好的穩定性,因此在互聯網領域非常受歡迎。
為什麼使用Nginx
- 高性能:Nginx采用事件驅動的異步架構,能夠處理大量並發連接而不會消耗過多的系統資源。它的處理能力比傳統的Web服務器更高,在高並發負載下表現出色。
- 高可靠性:Nginx具有強大的容錯能力和穩定性,能夠在面對高流量和DDoS攻擊等異常情況下保持可靠運行。它能通過健康檢查和自動故障轉移來保證服務的可用性。
- 負載均衡:Nginx可以作為反向代理服務器,實現負載均衡,將請求均勻分發給多個後端服務器。這樣可以提高系統的整體性能和可用性。
- 靜態文件服務:Nginx對靜態資源(如HTML、CSS、JavaScript、圖片等)的處理非常高效。它可以直接緩存靜態文件,減輕後端服務器的負載。
- 擴展性:Nginx支持豐富的模塊化擴展,可以通過添加第三方模塊來提供額外的功能,如gzip壓縮、SSL/TLS加密、緩存控制等。
如何處理請求
Nginx處理請求的基本流程如下:
- 接收請求:Nginx作為服務器軟件監聽指定的端口,接收客戶端發來的請求。
- 解析請求:Nginx解析請求的內容,包括請求方法(GET、POST等)、URL、頭部信息等。
- 配置匹配:Nginx根據配置文件中的規則和匹配條件,決定如何處理該請求。配置文件定義了虛擬主機、反向代理、負載均衡、緩存等特定的處理方式。
- 處理請求:Nginx根據配置的處理方式,可能會進行以下操作:
- 靜態文件服務:如果請求的是靜態資源文件,如HTML、CSS、JavaScript、圖片等,Nginx可以直接返回文件內容,不必經過後端應用程序。
- 反向代理:如果配置了反向代理,Nginx將請求轉發給後端的應用服務器,然後將其響應返回給客戶端。這樣可以提供負載均衡、高可用性和緩存等功能。
- 緩存:如果啟用了緩存,Nginx可以緩存一些靜態或動態內容的響應,在後續相同的請求中直接返回緩存的響應,減少後端負載並提高響應速度。
- URL重寫:Nginx可以根據配置的規則對URL進行重寫,將請求從一個URL重定向到另一個URL或進行轉換。
- SSL/TLS加密:如果啟用了SSL/TLS,Nginx可以負責加密和解密HTTPS請求和響應。
- 訪問控制:Nginx可以根據配置的規則對請求進行訪問控制,例如限制IP訪問、進行身份認證等。
- 響應結果:Nginx根據處理結果生成響應報文,包括狀態碼、頭部信息和響應內容。然後將響應發送給客戶端。
什麼是正向代理和反向代理
![](https://news.xinpengboligang.com/upload/keji/751b35ab220d41a8971c14d2f3cd1b5d.jpeg)
正向代理
是指客戶端通過代理服務器發送請求到目標服務器。客戶端向代理服務器發送請求,代理服務器再將請求轉發給目標服務器,並將服務器的響應返回給客戶端。正向代理可以隱藏客戶端的真實IP地址,提供匿名訪問和訪問控制等功能。它常用於跨越防火墻訪問互聯網、訪問被封禁的網站等情況。
反向代理
是指客戶端發送請求到代理服務器,代理服務器再將請求轉發給後端的多個服務器中的一個或多個,並將後端服務器的響應返回給客戶端。客戶端並不直接訪問後端服務器,而是通過反向代理服務器來獲取服務。反向代理可以實現負載均衡、高可用性和安全性等功能。它常用於網站的高並發訪問、保護後端服務器、提供緩存和SSL終止等功能。
nginx 啟動和關閉
進入目錄:/usr/local/nginx/sbin
啟動命令:./nginx
重啟命令:nginx -s reload
快速關閉命令:./nginx -s stop
有序地停止,需要進程完成當前工作後再停止:./nginx -s quit
直接殺死nginx進程:killall nginx
目錄結構
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暫存目錄
├── conf # Nginx所有配置文件的目錄
│ ├── fastcgi.conf # fastcgi相關參數的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始備份文件
│ ├── fastcgi_params # fastcgi的參數文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒體類型
│ ├── mime.types.default
│ ├── nginx.conf #這是Nginx默認的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相關參數文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相關參數文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi臨時數據目錄
├── html # Nginx默認站點目錄
│ ├── 50x.html # 錯誤頁面優雅替代顯示文件,例如出現502錯誤時會調用此頁面
│ └── index.html # 默認的首頁文件
├── logs # Nginx日志目錄
│ ├── access.log # 訪問日志文件
│ ├── error.log # 錯誤日志文件
│ └── nginx.pid # pid文件,Nginx進程啟動後,會把所有進程的ID號寫到此文件
├── proxy_temp # 臨時目錄
├── sbin # Nginx 可執行文件目錄
│ └── nginx # Nginx 二進制可執行程序
├── scgi_temp # 臨時目錄
└── uwsgi_temp # 臨時目錄
配置文件nginx.conf
# 啟動進程,通常設置成和cpu的數量相等
worker_processes 1;
# 全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
# 進程pid文件
pid /var/run/nginx.pid;
# 工作模式及連接數上限
events {
# 僅用於linux2.6以上內核,可以大大提高nginx的性能
use epoll;
# 單個後臺worker process進程的最大並發鏈接數
worker_connections 1024;
# 客戶端請求頭部的緩沖區大小
client_header_buffer_size 4k;
# keepalive 超時時間
keepalive_timeout 60;
# 告訴nginx收到一個新連接通知後接受盡可能多的連接
# multi_accept on;
}
# 設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
# 文件擴展名與文件類型映射表義
include /etc/nginx/mime.types;
# 默認文件類型
default_type application/octet-stream;
# 默認編碼
charset utf-8;
# 服務器名字的hash表大小
server_names_hash_bucket_size 128;
# 客戶端請求頭部的緩沖區大小
client_header_buffer_size 32k;
# 客戶請求頭緩沖大小
large_client_header_buffers 4 64k;
# 設定通過nginx上傳文件的大小
client_max_body_size 8m;
# 開啟目錄列表訪問,合適下載服務器,默認關閉。
autoindex on;
# sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
# 必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,以平衡磁盤與網絡I/O處理速度
sendfile on;
# 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
#tcp_nopush on;
# 連接超時時間(單秒為秒)
keepalive_timeout 65;
# gzip模塊設置
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
# 開啟限制IP連接數的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
# 指定虛擬主機的配置文件,方便管理
include /etc/nginx/conf.d/*.conf;
# 負載均衡配置
upstream aaa {
# 請見上文中的五種配置
}
# 虛擬主機的配置
server {
# 監聽端口
listen 80;
# 域名可以有多個,用空格隔開
server_name www.aaa.com aaa.com;
# 默認入口文件名稱
index index.html index.htm index.php;
root /data/www/sk;
# 圖片緩存時間設置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${
expires 10d;
}
#JS和CSS緩存時間設置
location ~ .*.(js|css)?${
expires 1h;
}
# 日志格式設定
#$remote_addr與 $http_x_forwarded_for用以記錄客戶端的ip地址;
#$remote_user:用來記錄客戶端用戶名稱;
#$time_local:用來記錄訪問時間與時區;
#$request:用來記錄請求的url與http協議;
#$status:用來記錄請求狀態;成功是200,
#$body_bytes_sent :記錄發送給客戶端文件主體內容大小;
#$http_referer:用來記錄從那個頁面鏈接訪問過來的;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
# 定義本虛擬主機的訪問日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
# 對具體路由進行反向代理
location /connect-controller {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
# 後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# 允許客戶端請求的最大單文件字節數
client_max_body_size 10m;
# 緩沖區代理緩沖用戶端請求的最大字節數,
client_body_buffer_size 128k;
# 表示使nginx阻止HTTP應答代碼為400或者更高的應答。
proxy_intercept_errors on;
# nginx跟後端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
# 後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據
proxy_send_timeout 90;
# 連接成功後,後端服務器響應的超時時間
proxy_read_timeout 90;
# 設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
proxy_buffer_size 4k;
# 設置用於讀取應答的緩沖區數目和大小,默認情況也為分頁大小,根據操作系統的不同可能是4k或者8k
proxy_buffers 4 32k;
# 高負荷下緩沖大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
# 設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長
# 設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
}
# 動靜分離反向代理配置(多路由指向不同的服務端或界面)
location ~ .(jsp|jspx|do)?$ {
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_pass http://127.0.0.1:8080;
}
}
}
location
location指令的作用就是根據用戶請求的URI來執行不同的應用
語法
location [ = | ~ | ~* | ^~ ] uri {...}
location [ = | ~ | ~* | ^~ ] uri {...}
- [ = | ~ | ~* | ^~ ]:匹配的標識
- ~與~*的區別是:~區分大小寫,~*不區分大小寫
- ^~:進行常規字符串匹配後,不做正則表達式的檢查
- uri:匹配的網站地址
- {...}:匹配uri後要執行的配置段
舉例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /sk/ {
[ configuration C ]
}
location ^~ /img/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
- = / 請求 / 精準匹配A,不再往下查找
- / 請求/index.html匹配B。首先查找匹配的前綴字符,找到最長匹配是配置B,接著又按照順序查找匹配的正則。結果沒有找到,因此使用先前標記的最長匹配,即配置B。
- /sk/ 請求/sk/abc 匹配C。首先找到最長匹配C,由於後面沒有匹配的正則,所以使用最長匹配C。
- ~* .(gif|jpg|jpeg)$ 請求/sk/logo.gif 匹配E。首先進行前綴字符的查找,找到最長匹配項C,繼續進行正則查找,找到匹配項E。因此使用E。
- ^~ 請求/img/logo.gif匹配D。首先進行前綴字符查找,找到最長匹配D。但是它使用了^~修飾符,不再進行下面的正則的匹配查找,因此使用D。
單頁面應用刷新404問題
location / {
try_files $uri $uri/ /index.html;
}
配置跨域請求
server {
listen 80;
location / {
# 服務器默認是不被允許跨域的。
# 配置`*`後,表示服務器可以接受所有的請求源(Origin),即接受所有跨域的請求
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# 發送"預檢請求"時,需要用到方法 OPTIONS ,所以服務器需要允許該方法
# 給OPTIONS 添加 204的返回,是為了處理在發送POST請求時Nginx依然拒絕訪問的錯誤
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
開啟gzip壓縮
# gzip模塊設置
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
# 設置什麼類型的文件需要壓縮
gzip_types text/plain application/x-javascript text/css application/xml;
# 用於設置使用Gzip進行壓縮發送是否攜帶“Vary:Accept-Encoding”頭域的響應頭部
# 主要是告訴接收方,所發送的數據經過了Gzip壓縮處理
gzip_vary on;
總體而言,Nginx是一款輕量級、高性能、可靠性強且擴展性好的服務器軟件,適用於搭建高可用性、高性能的Web應用程序和網站。
原文鏈接:
https://juejin.cn/post/7270153705877241890