Nginx?部署及配置詳細(xì)步驟(附詳細(xì)代碼)
一、前言
Nginx 是現(xiàn)代 Web 架構(gòu)中不可或缺的組件,廣泛用于反向代理、負(fù)載均衡、靜態(tài)資源服務(wù)和安全網(wǎng)關(guān)。
二、基礎(chǔ)部署與核心配置
1. 常見安裝方式(以 Ubuntu 為例)
sudo apt update sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
2、核心目錄概覽
| 目錄 | 作用 |
|---|---|
/etc/nginx/ | 主配置文件目錄(最重要) |
/usr/sbin/nginx | Nginx 可執(zhí)行程序(命令行工具) |
/var/log/nginx/ | 日志文件目錄(access.log、error.log) |
/usr/share/nginx/ | 默認(rèn)靜態(tài)文件根目錄(HTML 文件) |
/var/cache/nginx/ | 緩存文件目錄(如代理緩存,需要開啟緩存在存在這個目錄) |
/usr/share/man/man8/nginx.8.gz | 幫助手冊(man nginx) |
/run/nginx.pid | 存放主進(jìn)程 PID 的文件 |
詳細(xì)目錄與文件說明
2.1 /etc/nginx/ —— 主配置目錄(? 核心)
這是你最常打交道的目錄,包含所有配置文件。
主要文件:
| 文件 | 說明 |
|---|---|
nginx.conf | 主配置文件,定義全局設(shè)置、events、http 塊等 |
mime.types | 定義文件擴(kuò)展名與 MIME 類型的映射(如 .css → text/css) |
conf.d/ | 子配置片段目錄,通常存放 *.conf 文件(如 ssl.conf) |
sites-available/ | 可用的站點(diǎn)配置(Debian/Ubuntu 特有) |
sites-enabled/ | 啟用的站點(diǎn)配置,通過軟鏈接指向 sites-available/ |
?? Debian/Ubuntu 使用
sites-available和sites-enabled實(shí)現(xiàn)“多站點(diǎn)管理”,類似 Apache。 CentOS/RHEL 通常只用conf.d/。每次修改配置前,建議備份并在修改后測試
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak sudo nginx -t # 檢查配置是否有問題 sudo nginx -s reload # 向主進(jìn)程發(fā)送信號,重新加載配置文件,熱重啟
2.2 /var/log/nginx/ —— 日志目錄(? 運(yùn)維必備)
| 文件 | 說明 |
|---|---|
access.log | 訪問日志:記錄每個 HTTP 請求(IP、時間、URL、狀態(tài)碼等) |
error.log | 錯誤日志:記錄 Nginx 啟動、運(yùn)行、配置錯誤、后端連接失敗等 |
2.3 /usr/share/nginx/html/ —— 默認(rèn)靜態(tài)資源根目錄
- 這是 Nginx 默認(rèn)的 網(wǎng)站根目錄(Document Root)。
- 當(dāng)你訪問
http://服務(wù)器IP時,Nginx 會返回這個目錄下的index.html。 - 你可以將前端打包文件(如 Vue/React 的
dist/)復(fù)制到這里。
?? 權(quán)限:確保
www-data(Ubuntu)或nginx(CentOS)用戶有讀取權(quán)限
2.4./var/cache/nginx/—— 緩存目錄
用于存儲 代理緩存(如反向代理后端 API 或靜態(tài)資源)。
需要在配置中顯式啟用:
# 定義緩存區(qū) # 在 http 塊中定義緩存區(qū) proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; server_name cached-api.example.com; location /api/ { proxy_pass http://backend_servers; # 啟用緩存 proxy_cache my_cache; proxy_cache_valid 200 302 10m; # 成功響應(yīng)緩存 10 分鐘 proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout updating; # 緩存容錯機(jī)制 } }目錄結(jié)構(gòu)由 Nginx 自動管理,無需手動操作。
2.5./usr/share/man/man8/nginx.8.gz—— 幫助手冊
這是
man nginx命令使用的幫助文檔。壓縮格式(
.gz),但man命令會自動解壓。查看方式:
man nginx
一個Nginx配置例子如下
# main段配置信息
user www-data; # 指定運(yùn)行 Nginx 的 woker 子進(jìn)程的屬主和屬組,其中組可以不指定
pid /run/nginx.pid; # Nginx 服務(wù)啟動時的 pid 存放位置
worker_processes auto; # Nginx 進(jìn)程數(shù),一般設(shè)置為和 CPU 核數(shù)一樣
# worker_cpu_affinity 0001 0010 0100 1000; # 將每個 worker 進(jìn)程綁定到特定 CPU 核心(CPU 親和性)
worker_rlimit_nofile 20480; # 設(shè)置每個 Nginx worker 進(jìn)程能打開的最大文件描述符數(shù) 相當(dāng)于在進(jìn)程啟動時執(zhí)行 ulimit -n 20480
worker_rlimit_core 50M; # 限制每個 worker 進(jìn)程可生成的核心轉(zhuǎn)儲文件(core dump)大小當(dāng) Nginx worker 崩潰(如段錯誤)時,系統(tǒng)會將其內(nèi)存狀態(tài)寫入一個 core.* 文件 可選 0 或者 unlimited
working_directory /opt/nginx/tmp; # core 文件生成路徑該目錄必須存在且 Nginx 用戶(www-data)有寫權(quán)限:
worker_priority -10; # 設(shè)置 worker 進(jìn)程的調(diào)度優(yōu)先級(Linux nice 值)數(shù)值范圍:-20(最高優(yōu)先級)到 +19(最低優(yōu)先級) 默認(rèn)值:0
worker_shutdown_timeout 5s; # 設(shè)置 worker 進(jìn)程平滑關(guān)閉的最大等待時間
timer_resolution 100ms; # 配置事件定時器的系統(tǒng)調(diào)用頻率,提升性能 適合大多數(shù)場景
error_log /var/log/nginx/error.log; # Nginx 的錯誤日志存放目錄
include /etc/nginx/modules-enabled/*.conf; # 導(dǎo)入已配置模塊
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型 Linux上最高效 推薦注釋掉這行配置 讓Nginx自行選擇
worker_connections 768; # 每個 worker 最大連接數(shù)
multi_accept on; # 一次性接收多個連接
# accept_mutex on; # 開啟“互斥鎖(Mutex)”機(jī)制,確保同一時間只有一個 worker 進(jìn)程在監(jiān)聽并接受新連接 建議采用默認(rèn)值關(guān)閉 內(nèi)核級 EPOLLEXCLUSIVE(自 4.5+)已解決驚群問題 在高并發(fā)場景下,accept_mutex off 的吞吐量通常更高
}
# http段配置信息,是 Nginx 配置文件中最核心的部分,用于定義 所有 HTTP 相關(guān)的行為,包括:MIME 類型、日志格式、緩存、上游服務(wù)器、虛擬主機(jī)等。
http {
##
# Basic Settings
##
sendfile on; # 啟用“零拷貝”文件傳輸機(jī)制,大幅提升靜態(tài)文件性能 只對 static 文件有效(如 index.html),對反向代理動態(tài)內(nèi)容無效。
# tcp_nopush on; # 與 sendfile 配合使用,優(yōu)化 TCP 傳輸包的發(fā)送策略 這個配置配合sendfile用來優(yōu)化靜態(tài)配置
types_hash_max_size 2048; # 增大 MIME 類型哈希表大小,避免 MIME 類型沖突或警告
# tcp_nodelay on; # 啟用 TCP 的 Nagle 算法禁用機(jī)制,讓小數(shù)據(jù)包立即發(fā)送,而不是等待拼包提升實(shí)時性 這個配置和tcp_nopush互斥 專用來優(yōu)化反向代理
keepalive_timeout 65; # 控制 Nginx 與客戶端之間 TCP 連接在空閑多久后關(guān)閉 單位秒 建議 普通網(wǎng)站 65 高并發(fā) API 30 ~ 60(節(jié)省連接資源)長連接應(yīng)用(如 SSE) 300 ~ 75 可以配合keepalive_requests 使用 100; # 單個連接最多處理 100 個請求
# keepalive_requests 100; # 單個連接最多處理 100 個請求
server_tokens off; # 隱藏 Nginx 版本號,增強(qiáng)安全性
server_names_hash_bucket_size 64; # 控制 Nginx 內(nèi)部用于存儲 server_name 的哈希表的桶(bucket)大小 解決域名過多或過長的警告 必須是 2 的冪次方且不能超過 server_names_hash_max_size
server_name_in_redirect off; # 控制重定向時是否使用真實(shí)的 server_name 決定在 rewrite ... redirect 或 return 301/302 時,使用哪個域名生成跳轉(zhuǎn) URL 建議關(guān)閉
include /etc/nginx/mime.types; # 引入 MIME 類型映射表,讓 Nginx 知道不同文件擴(kuò)展名對應(yīng)哪種 Content-Type 必須包含,除非你手動定義所有類型
default_type application/octet-stream; # 設(shè)置當(dāng)無法識別文件類型時,默認(rèn)使用的 MIME 類型 推薦值,安全且合理
##
# SSL Settings
##
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
# ssl_prefer_server_ciphers on;
##
# Logging Settings
##
# 設(shè)置日志模式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream_response_time $upstream_response_time '
'request_time $request_time';
access_log /var/log/nginx/access.log main;
##
# Gzip Settings
##
gzip on; # 開啟 Gzip 壓縮功能
gzip_vary on; # 在響應(yīng)頭中添加 Vary: Accept-Encoding 告訴 CDN、反向代理、瀏覽器:壓縮版和非壓縮版是不同的資源
gzip_proxied no-cache no-store private expired auth; # 控制代理請求 在包含哪些響應(yīng)頭的時候開啟壓縮
gzip_comp_level 6; # 設(shè)置壓縮級別(1~9)
gzip_buffers 32 4k; # 設(shè)置壓縮緩沖區(qū)大小 表示使用 16 個 8KB 的緩沖區(qū)
gzip_http_version 1.1; # 指定啟用壓縮的最小 HTTP 版本
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定哪些 MIME 類型的響應(yīng)內(nèi)容需要壓縮
##
# Virtual Host Configs
##
# server段配置信息
server {
listen 80; # 配置監(jiān)聽的端口
server_name localhost; # 定義虛擬主機(jī)的域名或通配符,用于匹配客戶端請求的 Host 頭 支持精確匹配、通配符匹配、正則表達(dá)式匹配、泛域名匹配
# location段配置信息 定義如何處理匹配特定 URI 的請求,是 server 塊中最核心的子塊。=:精確匹配(優(yōu)先級最高)、~:區(qū)分大小寫的正則匹配、~*:不區(qū)分大小寫的正則匹配、^~:前綴匹配(匹配成功后不再檢查正則)、無修飾符:前綴匹配
location / {
root /usr/share/nginx/html; # 網(wǎng)站根目錄
index index.html index.htm; # 默認(rèn)首頁文件
deny 192.168.22.11; # 禁止訪問的ip地址,可以為all
allow 192.168.33.44; # 允許訪問的ip地址,可以為all
}
error_page 500 502 503 504 /50x.html; # 默認(rèn)50x對應(yīng)的訪問頁面
error_page 400 404 error.html; # 同上
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
server 塊中的關(guān)鍵指令詳解
listen:定義服務(wù)器監(jiān)聽的 IP 地址和端口。語法:
listen address:port [parameters];常用參數(shù):
default_server:將此 server 設(shè)為默認(rèn)服務(wù)器(當(dāng)沒有匹配的server_name時使用)。ssl:啟用 SSL/TLS。http2:啟用 HTTP/2。reuseport:允許多個 worker 進(jìn)程監(jiān)聽同一端口(提升性能)。
示例
listen 80; listen 443 ssl http2; listen 192.168.1.1:80 default_server;
server_name:定義虛擬主機(jī)的域名或通配符,用于匹配客戶端請求的Host頭。
語法:
server_name name1 name2 ...;支持類型
- 精確匹配:
example.com - 通配符:
*.example.com或www.example.* - 正則表達(dá)式:
~^www\d+\.example\.com$ - 泛域名匹配:
_(匹配任何 Host)
- 精確匹配:
示例
server_name example.com www.example.com; server_name *.example.com; server_name ~^(www|api)\.example\.com$;
location:定義如何處理匹配特定 URI 的請求,是server塊中最核心的子塊。語法:
location [modifier] pattern { ... }修飾符:
=:精確匹配(優(yōu)先級最高)~:區(qū)分大小寫的正則匹配~*:不區(qū)分大小寫的正則匹配^~:前綴匹配(匹配成功后不再檢查正則)- 無修飾符:前綴匹配
示例:
location / { root /var/www/html; } location = /favicon.ico { log_not_found off; access_log off; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }
root 與 alias:定義文件系統(tǒng)路徑映射。root:指定根目錄,請求 URI 會附加到該路徑后。location /static/ { root /var/www/html; # /static/file.css → /var/www/html/static/file.css }alias:直接替換 location 匹配部分location /static/ { alias /var/www/assets/; # /static/file.css → /var/www/assets/file.css }index:網(wǎng)站默認(rèn)首頁error_page:定義錯誤處理error_page 404 /404.html; error_page 500 502 503 504 /50x.html;
三、使用Nginx實(shí)現(xiàn)靜態(tài)資源下載
http {
# 1. 限制每個 IP 的并發(fā)連接數(shù)
limit_conn_zone $binary_remote_addr zone=perip:64k;
# 2. 限制請求頻率(可選)
# limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
}
server {
listen 80;
server_name download.example.com;
# 靜態(tài)文件根目錄
root /var/www/downloads;
# autoindex off; # 關(guān)閉目錄瀏覽(安全)
index index.html;
# 允許上傳大文件(如用于反向代理上傳)
client_max_body_size 10G;
# 讀取客戶端請求體的超時
client_body_timeout 60s;
# === 強(qiáng)制下載:常見文件類型 ===
location ~* \.(pdf|zip|tar|gz|tar\.gz|rar|7z|doc|docx|xls|xlsx|ppt|pptx|exe|msi|dmg|apk|mp4|avi|mkv|iso)$ {
# 強(qiáng)制下載,不預(yù)覽
add_header Content-Disposition "attachment";
# 緩存策略:可下載的文件一般不會頻繁變,可緩存
expires 7d;
add_header Cache-Control "public, immutable";
# 限速:每連接 1MB/s 注意:limit_rate 是每個連接的限速,多線程下載工具仍可突破。
limit_rate 1m;
# 限制每個 IP 最多 1 個并發(fā)連接
limit_conn perip 1;
# 限速前允許“突發(fā)”下載 5MB(提升體驗(yàn))
limit_rate_after 5m;
# 啟用 sendfile 提升大文件傳輸性能
sendfile on;
tcp_nopush on;
# 啟用斷點(diǎn)續(xù)傳(非常重要!)
add_header Accept-Ranges bytes;
# 禁用日志(可選,減少日志量)
access_log off;
# 防止中文亂碼
charset utf-8;
}
# === 可選:開啟目錄瀏覽(謹(jǐn)慎?。?==
location / {
autoindex on; # 自動目錄列表
autoindex_exact_size off; # 控制目錄列表中文件大小是否以精確字節(jié)數(shù)顯示。
autoindex_localtime on; # 控制目錄列表中文件時間是否顯示為本地時間。
# 防止中文亂碼
charset utf-8;
}
# === 安全:禁止訪問隱藏文件 ===
location ~ /\.(?!well-known) {
deny all;
}
# === 錯誤頁面 ===
error_page 404 /404.html;
location = /404.html {
internal;
}
}
四、使用Nginx實(shí)現(xiàn)反向代理 、負(fù)載均衡,限流、黑白名單
# 設(shè)置日志模式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream_response_time $upstream_response_time '
'request_time $request_time'
'cache_status:$upstream_cache_status '
'upstream_addr:$upstream_addr';
# 在 http 塊中定義緩存區(qū)
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m
max_size=10g
inactive=60m
use_temp_path=off;
# nginx.conf 或在 conf.d/ 下的配置文件
upstream backend_servers {
# 負(fù)載均衡:3 臺后端服務(wù)器,輪詢(默認(rèn))
server 192.168.10.10:8080 weight=1; # weight配置每臺服務(wù)器的權(quán)重 parameters 可選值:weight=number 權(quán)重值,默認(rèn)為1 max_conns=number 上游服務(wù)器的最大并發(fā)連接數(shù);fail_timeout=time 服務(wù)器不可用的判定時間;max_fails=numer 服務(wù)器不可用的檢查次數(shù);backup 備份服務(wù)器,僅當(dāng)其他服務(wù)器都不可用時才會啟用;down 標(biāo)記服務(wù)器長期不可用,離線維護(hù);
server 192.168.10.11:8080 weight=1;
server 192.168.10.12:8080 weight=1;
least_conn; # least_conn 將請求分配給當(dāng)前連接數(shù)最少的服務(wù)器 默認(rèn) round_robin 還可以配置 ip_hash、hash $request_uri consistent:基于 URL 一致性哈希
# 可選:健康檢查(需 Nginx Plus 或 OpenResty),開源版可用第三方模塊
# 在 Nginx 與 后端服務(wù)器(如應(yīng)用服務(wù)器)之間,為每個 worker 進(jìn)程保持最多 32 個空閑的長連接(keepalive 連接),用于后續(xù)請求復(fù)用,避免頻繁建立/斷開 TCP 連接。注意需要在location中配置proxy_http_version 1.1;proxy_set_header Connection "";這兩行配置 否則keepalive不生效
keepalive 32;
keepalive_requests 100; # 每個 keep-alive 連接最多處理 50 個請求后關(guān)閉。防止單個連接長時間占用 避免內(nèi)存泄漏、連接老化等問題
keepalive_timeout 30s; # 每個空閑 keep-alive 連接保持打開狀態(tài)最長 30 秒。
}
# 限流:定義共享內(nèi)存區(qū)
# 1. 限制每個 IP 的請求頻率(防刷)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;
# 2. 限制每個 IP 的并發(fā)連接數(shù)
limit_conn_zone $binary_remote_addr zone=conn_limit:1m;
server {
listen 80;
server_name api.example.com;
# 日志格式(可選增強(qiáng))
access_log /var/log/nginx/api.access.log main;
error_log /var/log/nginx/api.error.log warn;
# === 黑白名單控制 ===
# 方法 1:白名單優(yōu)先(只允許特定 IP)
# allow 192.168.10.0/24;
# allow 10.0.0.1;
# deny all;
# 方法 2:黑名單(禁止某些 IP)
include /etc/nginx/blacklist.conf; # 自定義黑名單文件
# === 限流規(guī)則 ===
# 限制每個 IP 最多 10 個并發(fā)連接
limit_conn conn_limit 10;
# 限制每個 IP 每秒最多 20 個請求,突發(fā)允許 40 個 # nodelay表示突發(fā)請求不延遲處理
limit_req zone=api_limit burst=40 nodelay;
# 保留客戶端真實(shí)信息 這四個必須要
proxy_set_header Host $host; # 將原始請求的 Host 頭原樣傳遞給后端
proxy_set_header X-Real-IP $remote_addr; # 告訴后端“客戶端的真實(shí) IP 地址”。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 構(gòu)建一個 請求經(jīng)過的代理鏈列表,記錄整個路徑上的 IP。 X-Forwarded-For: client_ip, proxy1_ip, proxy2_ip, ...
proxy_set_header X-Forwarded-Proto $scheme; # 告訴后端“原始請求是 HTTP 還是 HTTPS”。
# 超時設(shè)置 Nginx 與后端服務(wù)器通信時的三個超時時間
proxy_connect_timeout 30s; # 建立TCP鏈接的超時時間
proxy_send_timeout 30s; # Nginx 向后端服務(wù)器發(fā)送請求數(shù)據(jù)的超時時間。注意:不是整個請求發(fā)送的總時間,而是“連續(xù)寫之間的間隔超時”
proxy_read_timeout 30s; # Nginx 從后端服務(wù)器讀取響應(yīng)的超時時間。這個指令定義:兩次讀操作之間的等待時間不能超過 30 秒 如果后端處理請求的總時間可能很長,但只要它持續(xù)輸出響應(yīng)(比如流式輸出),就不會觸發(fā) proxy_read_timeout
# 強(qiáng)制協(xié)議版本(配合 keepalive)
proxy_http_version 1.1;
proxy_set_header Connection "";
# 緩沖區(qū)控制
proxy_buffering on; # 打開緩沖區(qū)
proxy_buffer_size 128k; # 用于存儲后端響應(yīng)“頭部”和“第一部分響應(yīng)體”的緩沖區(qū)大小。
proxy_buffers 4 256k; # 設(shè)置 用于存儲響應(yīng)體主體的緩沖區(qū)數(shù)量和大小。 當(dāng)響應(yīng)體超過 proxy_buffer_size 的容量時,剩余數(shù)據(jù)會存到這些緩沖區(qū)中
# 錯誤時重試下一臺
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# === 反向代理 + 負(fù)載均衡 ===
location /api {
# 反向代理到 upstream 注意 http://backend_servers 和 http://backend_servers/有很大的區(qū)別 帶不/會保留原始 URI,完整轉(zhuǎn)發(fā),帶/替換匹配部分為 /,相當(dāng)于路徑重寫
proxy_pass http://backend_servers;
}
# === 特殊路徑放行或加強(qiáng)限制 ===
# 例如:登錄接口限得更嚴(yán)
# location = /login {
# limit_req zone=api_limit burst=5 nodelay; # 更嚴(yán)格
# proxy_pass http://backend_servers;
# proxy_set_header Host $host;
# # ... 其他 proxy 設(shè)置
# }
# 靜態(tài)資源可緩存
location ~* \.(jpg|jpeg|png|gif|css|js|ico|webp)$ {
proxy_pass http://backend_servers;
# 啟用緩存
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 成功響應(yīng)緩存 10 分鐘
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating; # 緩存容錯機(jī)制
expires 10m; # 添加 Expires 頭
# add_header Cache-Control "public, immutable"; # public 表示該資源可以被 任何中間代理、CDN、瀏覽器緩存,immutable:這是一個性能優(yōu)化提示,告訴瀏覽器:“這個資源一旦緩存,內(nèi)容永遠(yuǎn)不會改變,你不用再發(fā)請求去檢查它是否更新!”
}
# 錯誤頁面
error_page 403 /403.html;
error_page 500 502 503 504 /50x.html;
}
五、解決跨域問題(CORS)
當(dāng)前端部署在 https://web.example.com,后端 API 在 https://api.example.com 時,需配置 CORS。
location /api/ {
proxy_pass http://backend_servers/;
# 啟用 CORS
add_header 'Access-Control-Allow-Origin' 'https://web.example.com' always; # 指定哪個源(Origin) 被允許訪問資源 always示無論響應(yīng)狀態(tài)碼是多少(即使是 500、404),都添加這個頭
add_header 'Access-Control-Allow-Methods' '*' always; # 聲明服務(wù)器支持的 HTTP 方法
add_header 'Access-Control-Allow-Headers' '*' always; # 聲明服務(wù)器允許客戶端發(fā)送的自定義請求頭
add_header 'Access-Control-Expose-Headers' '*' always; # 聲明哪些響應(yīng)頭可以被 JavaScript 讀取
# 預(yù)檢請求直接返回 204
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 86400; # 告訴瀏覽器:這個預(yù)檢結(jié)果可以緩存 86400 秒
add_header 'Content-Type' 'text/plain; charset=utf-8'; # 設(shè)置響應(yīng)體的 MIME 類型
add_header 'Content-Length' 0; # 與 return 204 配合,確保響應(yīng)正確
return 204;
}
}
? ?? 注意:生產(chǎn)環(huán)境避免使用 * 通配符,應(yīng)明確指定域名。
六、配置防盜鏈保護(hù)靜態(tài)資源
防止其他網(wǎng)站盜用你的圖片、視頻等資源。
防盜鏈配置(基于 Referer)
location ~* \.(jpg|jpeg|png|gif|mp4|avi|css|js)$ {
valid_referers none blocked *.example.com example.com; # 定義哪些 Referer(來源頁)是合法的。 none 表示允許 Referer 為空的請求(直接通過URL請求) blocked 表示 允許 Referer 被防火墻或代理屏蔽/加密的情況
if ($invalid_referer) {
return 403;
# 或重定向到默認(rèn)圖片
# rewrite ^/ https://example.com/forbidden.png redirect;
}
expires 1y;
add_header Cache-Control "public, immutable";
}
? 說明:
valid_referers定義合法來源$invalid_referer為 1 時表示非法引用- 結(jié)合緩存提升性能
七、SSL/TLS 證書配置(HTTPS)
使用 Let’s Encrypt 免費(fèi)證書實(shí)現(xiàn) HTTPS。
1. 使用 Certbot 自動獲取證書
sudo apt install certbot python3-certbot-nginx -y # 如果安裝不了需要換源 sudo certbot --nginx -d test.api.com # 域名需要公網(wǎng)可訪問 # certbot 生成的證書默認(rèn)放在 /etc/letsencrypt/live/your-domain.com/ 下邊 包含fullchain.pem證書鏈(Nginx 的 ssl_certificate) 和 privkey.pem 私鑰(Nginx 的 ssl_certificate_key) ,注意certbot會自動修改Nginx配置但也可以手動修改檢查 # systemctl list-timers | grep certbot # 檢查自動續(xù)期是否可用 # sudo certbot renew --dry-run # 手動測試?yán)m(xù)期 # 證書到期后Nginx需要重新加載證書才可用 可以通過添加鉤子的方法自動重載
2. 手動配置 SSL(示例)
# 生成自簽名證書 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/nginx/selfsigned.key \ -out /etc/ssl/nginx/selfsigned.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN= api.example.com"
| 參數(shù) | 含義 |
|---|---|
-x509 | 生成自簽名證書(不是證書請求) |
-nodes | 不加密私鑰(Nginx 啟動時不用輸密碼) |
-days 365 | 有效期 365 天 |
-newkey rsa:2048 | 生成 2048 位 RSA 密鑰 |
-keyout | 私鑰保存路徑 |
-out | 證書保存路徑 |
-subj | 證書信息(可自定義)CN=download.example.com 是你的域名 |
server {
listen 443 ssl http2; # 啟用https 和 http2協(xié)議
server_name api.example.com;
ssl_certificate /etc/ssl/nginx/selfsigned.crt; # ssl公鑰位置
ssl_certificate_key /etc/ssl/nginx/selfsigned.key; # ssl私鑰位置
ssl_protocols TLSv1.2 TLSv1.3; # 指定支持的 TLS 協(xié)議版本。
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; # 指定加密套件(Cipher Suites),決定客戶端和服務(wù)器如何加密通信。
ssl_prefer_server_ciphers off; # 控制是否優(yōu)先使用服務(wù)器指定的加密套件。off:客戶端優(yōu)先選擇(更兼容)on:服務(wù)器優(yōu)先(更安全)
# 安全頭
add_header Strict-Transport-Security "max-age=63072000" always; # 強(qiáng)制瀏覽器在未來 63072000 秒(約 2 年)內(nèi)只能通過 HTTPS 訪問
add_header X-Frame-Options DENY always; # 防止點(diǎn)擊劫持(Clickjacking)DENY:不允許被 <iframe> 嵌入
add_header X-Content-Type-Options nosniff always; # 防止 MIME 類型嗅探攻擊
add_header X-Permitted-Cross-Domain-Policies none always; # 防止舊式 Flash 跨域攻擊
add_header Referrer-Policy "no-referrer" always; # 瀏覽器在任何情況下都不會發(fā)送 Referer 頭。
location / {
proxy_pass http://backend_servers;
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_set_header X-Forwarded-Proto $scheme;
}
}
總結(jié)
到此這篇關(guān)于Nginx部署及配置的文章就介紹到這了,更多相關(guān)Nginx部署及配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx中IF語句實(shí)現(xiàn)數(shù)學(xué)比較功能
這篇文章主要介紹了Nginx中IF語句實(shí)現(xiàn)數(shù)學(xué)比較功能,即在Nginx中用if判斷數(shù)字大小,類似編程語言中的邏輯比較,需要的朋友可以參考下2015-02-02
Nginx+Tomcat+Https 服務(wù)器負(fù)載均衡配置實(shí)踐方案詳解
這篇文章主要介紹了Nginx+Tomcat+Https 服務(wù)器負(fù)載均衡配置實(shí)踐方案的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
Nginx HTTP反向代理負(fù)載均衡實(shí)驗(yàn)教程
文章描述了在192.168.65.135上部署Nginx作為七層HTTP反向代理,將www.xiaotiantian.org的流量輪詢轉(zhuǎn)發(fā)到兩臺后端Web服務(wù)器,并驗(yàn)證了反向代理的負(fù)載均衡和故障轉(zhuǎn)移功能2025-12-12
Nginx 502 Bad Gateway錯誤原因及解決方案
這篇文章主要介紹了Nginx 502 Bad Gateway錯誤原因及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
淺談Nginx請求限制和訪問控制的實(shí)現(xiàn)
這篇文章主要介紹了淺談Nginx請求限制和訪問控制的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Nginx 轉(zhuǎn)發(fā)匹配規(guī)則的實(shí)現(xiàn)
這篇文章主要介紹了Nginx 轉(zhuǎn)發(fā)匹配規(guī)則的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Nginx報(bào)Too Many Open Files總結(jié)
本文提供了解決Nginx服務(wù)器出現(xiàn)Too many open files錯誤的方法,包括檢查和調(diào)整文件句柄限制、修改系統(tǒng)配置文件及nginx配置等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01

