Nginx 安裝與配置完整指南
一、安裝 Nginx
1.1 添加 Nginx 官方倉庫
在 CentOS 系統中,默認倉庫的 Nginx 版本可能較舊(通常為 1.12 或更早版本),建議添加官方倉庫來安裝最新穩定版本(目前為 1.25.x):
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1
EOF
此命令會創建 /etc/yum.repos.d/nginx.repo
文件,配置 Nginx 官方 YUM 倉庫。其中:
baseurl
會根據 CentOS 版本自動匹配(例如 CentOS 7 對應 7/$basearch/,CentOS 8 對應 8/$basearch/)gpgcheck=0
表示不進行 GPG 驗證(生產環境建議設為1并導入密鑰:sudo rpm --import http://nginx.org/keys/nginx_signing.key
)enabled=1
表示啟用該倉庫
1.2 安裝 Nginx 軟件包
sudo yum install -y nginx
安裝完成后,系統會自動創建以下重要文件和目錄:
- 主程序:
/usr/sbin/nginx
- 配置文件目錄:
/etc/nginx/
- 主配置文件:
nginx.conf
- 虛擬主機配置目錄:
conf.d/
- 模塊配置目錄:
modules-available/
- 主配置文件:
- 默認網站目錄:
/usr/share/nginx/html
- 日志目錄:
/var/log/nginx/
- 訪問日志:
access.log
- 錯誤日志:
error.log
- 訪問日志:
- 系統服務單元:
/usr/lib/systemd/system/nginx.service
1.3 啟動服務并設置開機自啟
# 啟動Nginx服務
sudo systemctl start nginx# 設置開機自動啟動
sudo systemctl enable nginx
驗證服務狀態:
sudo systemctl status nginx
正常輸出應顯示"active (running)"狀態。常見狀態說明:
active (running)
:服務正常運行failed
:啟動失敗(需檢查日志)inactive (dead)
:服務已停止
二、防火墻配置
2.1 開放基礎端口
# 永久開放HTTP(80)和HTTPS(443)服務
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https# 重新加載防火墻規則
sudo firewall-cmd --reload
對于云服務器(如AWS、阿里云等),還需在安全組中開放80和443端口:
- 登錄云平臺控制臺
- 找到對應實例的安全組配置
- 添加入站規則:TCP 80和443,源地址0.0.0.0/0
2.2 可選端口管理
查看已開放端口和服務:
sudo firewall-cmd --list-all
輸出示例:
public (active)target: defaulticmp-block-inversion: nointerfaces: eth0sources: services: dhcpv6-client http https sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
臨時開放特定端口(測試用,重啟后失效):
sudo firewall-cmd --add-port=8080/tcp
永久開放端口:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
三、驗證安裝
訪問服務器公網 IP(如 http://你的服務器IP
),應看到 Nginx 默認歡迎頁(顯示"Welcome to nginx!")。
若無法訪問,檢查步驟:
- 檢查防火墻設置
sudo firewall-cmd --list-all
- 確認服務器網絡配置
curl -I localhost # 本地測試 ping 你的服務器IP # 檢查網絡連通性
- 查看 Nginx 錯誤日志
sudo tail -f /var/log/nginx/error.log
- 檢查端口監聽狀態
正常應顯示:sudo netstat -tulnp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx: master
四、配置文件結構
4.1 主要配置文件
- 主配置文件:
/etc/nginx/nginx.conf
- 包含全局設置、events 塊和 http 塊
- 通常通過
include
指令加載其他配置文件
典型結構示例:
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {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;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;gzip on;include /etc/nginx/conf.d/*.conf;
}
- 虛擬主機配置目錄:
/etc/nginx/conf.d/
- 建議每個站點單獨創建
.conf
文件 - 文件名通常與域名一致,如
example.com.conf
- 建議每個站點單獨創建
4.2 重要目錄
-
默認網站根目錄:
/usr/share/nginx/html
- 存放靜態網頁文件
- 可修改為自定義路徑
-
日志文件:
- 訪問日志:
/var/log/nginx/access.log
- 記錄所有訪問請求
- 錯誤日志:
/var/log/nginx/error.log
- 記錄Nginx運行錯誤和警告
- 訪問日志:
-
PID 文件:
/run/nginx.pid
- 存儲Nginx主進程的進程ID
- 用于服務管理和進程控制
五、虛擬主機配置示例
5.1 創建站點配置文件
/etc/nginx/conf.d/example.com.conf
示例:
server {listen 80;server_name example.com www.example.com;# 網站根目錄設置root /var/www/example.com;index index.html index.htm;# 日志配置access_log /var/log/nginx/example.com.access.log main;error_log /var/log/nginx/example.com.error.log warn;# 默認請求處理location / {try_files $uri $uri/ =404;}# 靜態文件緩存設置location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;add_header Cache-Control "public, no-transform";}# 禁止訪問隱藏文件location ~ /\. {deny all;}# 自定義錯誤頁面error_page 404 /404.html;error_page 500 502 503 504 /50x.html;
}
5.2 創建網站目錄并設置權限
# 創建網站目錄
sudo mkdir -p /var/www/example.com# 設置目錄所有權(Nginx運行用戶通常為nginx)
sudo chown -R nginx:nginx /var/www/example.com# 設置目錄權限
sudo chmod -R 755 /var/www/example.com# 創建測試頁面
echo "<!DOCTYPE html>
<html>
<head><title>Welcome to example.com</title>
</head>
<body><h1>Welcome to example.com</h1><p>This is a test page for Nginx configuration.</p>
</body>
</html>" | sudo tee /var/www/example.com/index.html# 創建錯誤頁面
echo "<h1>404 Not Found</h1>" | sudo tee /var/www/example.com/404.html
echo "<h1>50x Server Error</h1>" | sudo tee /var/www/example.com/50x.html
5.3 測試并重載配置
# 測試配置語法是否正確
sudo nginx -t# 如果測試通過,平滑重載配置(不影響現有連接)
sudo systemctl reload nginx# 或者完全重啟服務(會中斷現有連接)
sudo systemctl restart nginx
配置測試成功輸出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
六、常見問題解決方案
6.1 Nginx 啟動失敗
檢查步驟:
-
查看錯誤信息
sudo journalctl -xe sudo tail -f /var/log/nginx/error.log
-
端口沖突檢查
sudo netstat -tulnp | grep :80
如果其他服務(如Apache)占用了80端口,需要先停止它們:
sudo systemctl stop httpd sudo systemctl disable httpd
-
配置文件測試
sudo nginx -t
-
檢查SELinux狀態
getenforce
6.2 SELinux 相關問題
臨時解決方案(不推薦生產環境):
sudo setenforce 0
永久解決方案(需重啟生效):
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
更安全的做法是配置正確的SELinux上下文:
# 為網站目錄設置httpd上下文
sudo chcon -R -t httpd_sys_content_t /var/www/example.com# 允許Nginx訪問網絡
sudo setsebool -P httpd_can_network_connect 1
七、性能優化建議
7.1 進程配置優化
/etc/nginx/nginx.conf
示例:
worker_processes auto; # 自動匹配CPU核心數
worker_rlimit_nofile 65535; # 提高worker進程能打開的文件描述符數量events {worker_connections 4096; # 每個worker的最大連接數use epoll; # 高效事件模型(Linux專用)multi_accept on; # 一次接受多個連接
}
調整系統限制:
# 編輯/etc/security/limits.conf
echo "nginx soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "nginx hard nofile 65535" | sudo tee -a /etc/security/limits.conf
7.2 連接優化
http {keepalive_timeout 65; # 保持連接的超時時間keepalive_requests 100; # 單個連接的最大請求數sendfile on; # 啟用高效文件傳輸tcp_nopush on; # 優化數據包發送tcp_nodelay on; # 禁用Nagle算法client_body_buffer_size 10K;client_header_buffer_size 1k;client_max_body_size 8m;large_client_header_buffers 2 1k;
}
7.3 壓縮配置
gzip on;
gzip_min_length 1k; # 最小壓縮文件大小
gzip_comp_level 6; # 壓縮級別(1-9)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on; # 根據客戶端支持情況決定是否壓縮
gzip_disable "MSIE [1-6]\."; # 對舊版IE禁用壓縮
gzip_proxied any; # 對所有代理請求啟用壓縮
7.4 緩存優化
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;server {location / {proxy_cache my_cache;proxy_cache_key "$scheme$request_method$host$request_uri";proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;add_header X-Proxy-Cache $upstream_cache_status;}
}
創建緩存目錄并設置權限:
sudo mkdir -p /var/cache/nginx
sudo chown nginx:nginx /var/cache/nginx
八、HTTPS 配置建議
8.1 使用 Certbot 自動配置
安裝 Certbot(Let's Encrypt客戶端):
sudo yum install -y epel-release
sudo yum install -y certbot python3-certbot-nginx
申請證書(自動配置Nginx):
sudo certbot --nginx -d example.com -d www.example.com
按照提示操作后,Certbot會:
- 驗證域名所有權
- 獲取SSL證書
- 自動修改Nginx配置啟用HTTPS
- 設置自動續期任務
手動續期測試:
sudo certbot renew --dry-run
查看自動續期任務:
sudo systemctl list-timers | grep certbot
8.2 手動配置示例
/etc/nginx/conf.d/example.com_ssl.conf
:
server {listen 443 ssl http2;server_name example.com www.example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;# 安全配置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;# OCSP Staplingssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8 8.8.4.4 valid=300s;resolver_timeout 5s;# 其他站點配置...root /var/www/example.com;index index.html;location / {try_files $uri $uri/ =404;}
}# HTTP重定向到HTTPS
server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;
}
配置完成后測試并重載:
sudo nginx -t
sudo systemctl reload nginx
檢查SSL配置質量:
curl -I https://example.com
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text
可以使用在線工具測試SSL配置:
- SSL Labs Test
- Mozilla SSL Config Generator