手把手教你配置Nginx:從入門到精通的完整指南

夢(mèng)想家  ?   ? 關(guān)注:247

這是一份詳細(xì)的 Nginx 配置說明教程,從基礎(chǔ)概念到核心配置,再到實(shí)用場(chǎng)景,旨在幫助您系統(tǒng)性地掌握 Nginx 配置。


Nginx 配置全解析:從入門到精通

Nginx 以其高性能、高穩(wěn)定性和低資源消耗而聞名,是現(xiàn)代 Web 架構(gòu)的基石。理解其配置是有效使用 Nginx 的關(guān)鍵。

一、 核心概念與配置文件結(jié)構(gòu)

1. 配置文件位置

  • 主配置文件:通常位于 /etc/nginx/nginx.conf
  • 子配置文件:主配置文件可以通過 include 指令引入其他配置,通常站點(diǎn)配置放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/ 目錄下。

2. 配置文件結(jié)構(gòu)
Nginx 配置文件由 指令 和 上下文塊 組成,層次分明。

# 全局上下文 (Main Context) # 設(shè)置影響Nginx全局的指令,如工作進(jìn)程數(shù)、用戶、日志等。 user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # events上下文 # 設(shè)置影響Nginx與客戶端網(wǎng)絡(luò)連接的參數(shù)。 events { worker_connections 1024; # 每個(gè)工作進(jìn)程的最大連接數(shù) use epoll; # 使用高效的事件模型(Linux) } # http上下文 # 所有HTTP相關(guān)的配置都嵌套在此上下文中。 http { # 引入MIME類型定義 include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式定義 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 服務(wù)器上下文 (Server Context) # 定義一個(gè)虛擬主機(jī)(Virtual Host),監(jiān)聽特定的端口和域名。 server { listen 80; # 監(jiān)聽80端口 server_name example.com www.example.com; # 監(jiān)聽的域名 # 位置上下文 (Location Context) # 根據(jù)請(qǐng)求的URI來匹配和處理請(qǐng)求。 location / { root /usr/share/nginx/html; # 網(wǎng)站根目錄 index index.html index.htm; # 默認(rèn)索引文件 } location /images/ { # 匹配以 /images/ 開頭的請(qǐng)求 root /data; # 最終文件路徑為:/data/images/<請(qǐng)求的文件> }
    } # 可以定義多個(gè)server塊來托管多個(gè)網(wǎng)站 server { listen 80; server_name another-site.com; # ... 另一個(gè)站點(diǎn)的配置 }
}

3. 配置文件的繼承與優(yōu)先級(jí)

  • 子上下文會(huì)繼承父上下文的配置。
  • 如果子上下文有與父上下文相同的指令,子上下文的指令會(huì)覆蓋父上下文的設(shè)置。
  • 優(yōu)先級(jí):location 塊 > server 塊 > http 塊。

二、 核心配置指令詳解

1. 靜態(tài)文件服務(wù)
這是 Nginx 最基本也是最常用的功能。

server { listen 80; server_name example.com; location / { root /var/www/html; # 根目錄 index index.html; # 默認(rèn)首頁 # 開啟高效文件傳輸 sendfile on; # 防止大文件阻塞sendfile tcp_nopush on;
    } # 為靜態(tài)資源(如圖片、CSS、JS)設(shè)置緩存,提升性能 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { root /var/www/html; expires 30d; # 設(shè)置瀏覽器緩存過期時(shí)間為30天 add_header Cache-Control "public, immutable";
    }
}

2. 反向代理
將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到后端的應(yīng)用服務(wù)器(如 Tomcat, Node.js, Gunicorn 等)。

server { listen 80; server_name myapp.com; location / { # 核心代理指令:將請(qǐng)求傳遞給后端服務(wù)器組 ‘backend_server’ proxy_pass http://backend_server; # 以下指令確保后端服務(wù)器能獲取到客戶端的真實(shí)信息 proxy_set_header Host $host; # 傳遞原始域名 proxy_set_header X-Real-IP $remote_addr; # 傳遞客戶端真實(shí)IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 傳遞代理IP鏈 proxy_set_header X-Forwarded-Proto $scheme; # 傳遞原始協(xié)議(http/https) # 超時(shí)設(shè)置 proxy_connect_timeout 30s; proxy_send_timeout 60s; proxy_read_timeout 60s;
    }
} # 定義上游服務(wù)器組,支持負(fù)載均衡 upstream backend_server { # 負(fù)載均衡算法,默認(rèn)為輪詢 (round-robin) # 其他算法:least_conn(最少連接)、ip_hash(IP哈希,用于會(huì)話保持) # ip_hash; server 192.168.1.100:8080 weight=3; # weight表示權(quán)重,值越大分配請(qǐng)求越多 server 192.168.1.101:8080; server 192.168.1.102:8080 down; # 標(biāo)記為下線,不參與負(fù)載 server 192.168.1.103:8080 backup; # 備份服務(wù)器,只有當(dāng)其他服務(wù)器都不可用時(shí)才啟用 }

3. 負(fù)載均衡
如上例中的 upstream 模塊,Nginx 支持多種負(fù)載均衡算法,輕松實(shí)現(xiàn)應(yīng)用的水平擴(kuò)展。

4. HTTPS/SSL 配置
使用 SSL 證書加密網(wǎng)站流量。

server { listen 443 ssl http2; # 監(jiān)聽443端口,啟用SSL和HTTP/2 server_name example.com; # SSL證書路徑 ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL安全配置 ssl_protocols TLSv1.2 TLSv1.3; # 啟用安全的協(xié)議版本 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; # 啟用HSTS,強(qiáng)制瀏覽器使用HTTPS add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; location / { proxy_pass http://backend_server; # ... 其他代理設(shè)置 }
} # 強(qiáng)制將HTTP請(qǐng)求重定向到HTTPS server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; # 301永久重定向 }

三、 常用場(chǎng)景配置片段

1. 路徑重寫(Rewrite)
常用于偽靜態(tài)、URL 美化或框架路由。

location /api/ { # 將 /api/users 重寫為 /users?api=true rewrite ^/api/(.*)$ /$1?api=true break; proxy_pass http://backend_server;
} # 單頁應(yīng)用(如Vue, React)路由配置 location / { try_files $uri $uri/ /index.html; # 嘗試按順序?qū)ふ椅募舳颊也坏絼t返回index.html }

2. 訪問控制
限制特定 IP 的訪問。

location /admin/ { deny 192.168.1.5; # 拒絕單個(gè)IP allow 192.168.1.0/24; # 允許一個(gè)網(wǎng)段 deny all; # 拒絕所有其他IP # ... 其他配置 }

3. 啟用 Gzip 壓縮
減少傳輸數(shù)據(jù)量,提升加載速度。

http { gzip on; gzip_vary on; gzip_min_length 1024; # 只壓縮大于1KB的文件 gzip_types text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/json
        image/svg+xml;
}

4. 限制請(qǐng)求速率
防止惡意攻擊或流量濫用。

# 在http塊中定義限流zone http { limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
} server { location /api/ { limit_req zone=api_limit burst=20 nodelay; # 速率限制:10req/s,突發(fā)隊(duì)列20 proxy_pass http://backend_server;
    }
}

四、 配置檢查與常用命令

1.檢查配置語法是否正確極其重要!

sudo nginx -t
輸出 syntax is ok 和 test is successful 表示配置正確。

2.重新加載配置(不中斷服務(wù))

sudo nginx -s reload

3.停止 Nginx

sudo nginx -s stop # 快速停止 sudo nginx -s quit # 優(yōu)雅停止(處理完當(dāng)前請(qǐng)求)

4.查看 Nginx 版本和編譯信息

nginx -V

五、 最佳實(shí)踐與總結(jié)

  • 最小權(quán)限原則:使用非 root 用戶(如 www-data, nginx)運(yùn)行 Nginx 工作進(jìn)程。
  • 日志管理:定期輪詢(rotate)日志文件,避免磁盤被撐滿。可使用 logrotate 工具。
  • 保持更新:及時(shí)升級(jí) Nginx 版本以獲取安全補(bǔ)丁和新功能。
  • 測(cè)試先行:每次修改配置后,務(wù)必先執(zhí)行 nginx -t 進(jìn)行測(cè)試,然后再重載。

核心思想:Nginx 配置是一個(gè)由外到內(nèi)、由全局到局部的匹配過程。理解 http -> server -> location 的層次關(guān)系,是靈活配置的鑰匙。從簡(jiǎn)單的靜態(tài)服務(wù)器到復(fù)雜的反向代理和負(fù)載均衡網(wǎng)關(guān),Nginx 都能通過清晰的配置文件勝任。

本文鏈接:http://www.51gecaochuan.cn/article/78402.html(轉(zhuǎn)載請(qǐng)保留)