🏡作者主頁:點擊!
Nginx-從零開始的服務器之旅專欄:點擊!
🐧Linux高級管理防護和群集專欄:點擊!
??創作時間:2025年5月30日14點22分
前言
說起Web服務器,大家第一反應可能是Apache,但作為一個在運維路上摸爬滾打的技術人,我必須要為Nginx正名一下!這個由俄羅斯大神Igor Sysoev開發的輕量級HTTP服務器,真的是我見過最"能打"的Web服務器之一。
為什么這么說?單臺服務器能扛30000-50000個并發連接,內存消耗還特別低,這性能簡直逆天!今天就來分享一下我在實際項目中使用Nginx的經驗,從基礎安裝到LNMP架構搭建,希望能幫到正在學習的小伙伴們。
🚀 一、Nginx基礎安裝與配置
Nginx vs Apache 性能對比圖
┌─────────────────────────────────────────────────────────────────────┐
│ Nginx vs Apache 性能對比 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 🟢 Nginx 🔴 Apache │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 🚀 并發: 30K-50K │ │ 🚀 并發: 1K-5K │ │
│ │ 💾 內存: 低 │ │ 💾 內存: 較高 │ │
│ │ ? CPU: 低 │ │ ? CPU: 較高 │ │
│ │ 🔄 模式: 異步事件 │ │ 🔄 模式: 進程/線程 │ │
│ │ 📈 靜態文件: 優秀 │ │ 📈 靜態文件: 良好 │ │
│ │ 🔧 配置: 簡潔 │ │ 🔧 配置: 功能豐富 │ │
│ │ 🌐 負載均衡: 內置 │ │ 🌐 負載均衡: 需模塊 │ │
│ │ 📊 反向代理: 高效 │ │ 📊 動態內容: 強大 │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
1.1 編譯安裝Nginx
首先我們需要準備編譯環境,這一步很關鍵:
# 安裝必要的依賴包
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc++ gcc
為什么要安裝這些包?
pcre-devel
:支持正則表達式zlib-devel
:支持gzip壓縮gcc++/gcc
:編譯器
接下來創建專用用戶(安全第一):
# 創建nginx用戶,不允許登錄shell
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
Nginx 安裝流程圖
┌─────────────────────────────────────────────────────────────┐
│ Nginx 安裝配置流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ 1. 安裝依賴包 │ ← pcre-devel zlib-devel gcc │
│ └─────────────────┘ │
│ ↓ │
│ ┌─────────────────┐ │
│ │ 2. 創建運行用戶 │ ← useradd -M -s /sbin/nologin nginx │
│ └─────────────────┘ │
│ ↓ │
│ ┌─────────────────┐ │
│ │ 3. 編譯安裝 │ ← ./configure && make && make install │
│ └─────────────────┘ │
│ ↓ │
│ ┌─────────────────┐ │
│ │ 4. 創建服務腳本 │ ← /etc/init.d/nginx │
│ └─────────────────┘ │
│ ↓ │
│ ┌─────────────────┐ │
│ │ 5. 啟動測試 │ ← systemctl start nginx │
│ └─────────────────┘ │
│ │
│ 關鍵配置參數: │
│ --prefix=/usr/local/nginx │
│ --user=nginx │
│ --group=nginx │
│ --with-http_stub_status_module │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 編譯配置
這里是關鍵步驟,配置參數要仔細:
[root@localhost ~]# tar zxf nginx-1.12.0.tar.gz
[root@localhost ~]# cd nginx-1.12.0# 配置編譯參數
[root@localhost nginx-1.12.0]# ./configure \--prefix=/usr/local/nginx \ # 安裝目錄--user=nginx \ # 運行用戶--group=nginx \ # 運行組--with-http_stub_status_module # 狀態統計模塊# 編譯安裝
[root@localhost nginx-1.12.0]# make && make install
小技巧:創建軟鏈接方便使用
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1.3 Nginx配置文件結構
┌─────────────────────────────────────────────────────────────┐
│ Nginx 配置文件結構 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 全局配置 (Global) │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ user nginx; │ │ │
│ │ │ worker_processes 1; │ │ │
│ │ │ error_log logs/error.log; │ │ │
│ │ │ pid logs/nginx.pid; │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 事件配置 (Events) │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ events { │ │ │
│ │ │ use epoll; │ │ │
│ │ │ worker_connections 4096; │ │ │
│ │ │ } │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ HTTP配置 (HTTP) │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ http { │ │ │
│ │ │ include mime.types; │ │ │
│ │ │ sendfile on; │ │ │
│ │ │ ┌─────────────────────────────────────────┐ │ │ │
│ │ │ │ 服務器配置 (Server) │ │ │ │
│ │ │ │ ┌─────────────────────────────────────┐ │ │ │ │
│ │ │ │ │ server { │ │ │ │ │
│ │ │ │ │ listen 80; │ │ │ │ │
│ │ │ │ │ server_name www.example.com; │ │ │ │ │
│ │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │
│ │ │ │ │ │ 位置配置 (Location) │ │ │ │ │ │
│ │ │ │ │ │ location / { │ │ │ │ │ │
│ │ │ │ │ │ root html; │ │ │ │ │ │
│ │ │ │ │ │ index index.html; │ │ │ │ │ │
│ │ │ │ │ │ } │ │ │ │ │ │
│ │ │ │ │ └─────────────────────────────┘ │ │ │ │ │
│ │ │ │ │ } │ │ │ │ │
│ │ │ │ └─────────────────────────────────────┘ │ │ │ │
│ │ │ └─────────────────────────────────────────┘ │ │ │
│ │ │ } │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
核心配置示例:
# 全局配置
user nginx; # 運行用戶
worker_processes 1; # 工作進程數(建議=CPU核數)
error_log logs/error.log; # 錯誤日志# 事件配置
events {use epoll; # 使用epoll模型(Linux推薦)worker_connections 4096; # 每個進程最大連接數
}# HTTP配置
http {include mime.types;default_type application/octet-stream;sendfile on; # 開啟高效文件傳輸keepalive_timeout 65; # 連接保持時間server {listen 80;server_name www.example.com;location / {root html;index index.html index.htm;}}
}
1.4 系統服務腳本
為了方便管理,我們創建一個系統服務腳本:
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control ScriptPROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"case "$1" in
start)$PROG;;
stop)kill -s QUIT $(cat $PIDF);;
restart)$0 stop$0 start;;
reload)kill -s HUP $(cat $PIDF) # 重載配置,不中斷服務;;
*)echo "Usage: $0 {start|stop|restart|reload}"exit 1
esac
exit 0
# 添加執行權限并注冊服務
[root@localhost ~]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx
[root@localhost ~]# systemctl start nginx
🔒 二、Nginx訪問控制
2.1 基于用戶認證的訪問控制
訪問控制流程圖
┌─────────────────────────────────────────────────────────────┐
│ Nginx 訪問控制機制 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 用戶請求 │────→│ Nginx │────→│ 認證檢查 │ │
│ │ Request │ │ Server │ │ Auth? │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ ▼ │ ▼ │
│ ┌─────────────┐ │ ┌─────────────┐ │
│ │ 401 未授權 │ │ │ 200 成功 │ │
│ │ 要求認證 │ │ │ 返回內容 │ │
│ └─────────────┘ │ └─────────────┘ │
│ ▲ │ ▲ │
│ │ │ │ │
│ 認證失敗 認證成功 │
│ │
│ 配置示例: │
│ auth_basic "管理員區域"; │
│ auth_basic_user_file /path/to/passwd; │
│ │
└─────────────────────────────────────────────────────────────┘
有時候我們需要對某些目錄進行保護,這時候用戶認證就派上用場了:
# 安裝htpasswd工具
[root@localhost ~]# yum install -y httpd-tools# 創建用戶密碼文件
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db admin
New password:
Re-type new password:
Adding password for user admin
設置文件權限(重要):
[root@localhost ~]# chmod 400 /usr/local/nginx/passwd.db
[root@localhost ~]# chown nginx /usr/local/nginx/passwd.db
配置nginx.conf:
server {location /admin {auth_basic "管理員區域"; # 認證提示信息auth_basic_user_file /usr/local/nginx/passwd.db; # 密碼文件路徑root html;index index.html;}
}
2.2 基于IP的訪問控制
這個功能在實際項目中超級實用,比如只允許辦公網IP訪問后臺:
server {location /admin {deny 192.168.1.100; # 拒絕特定IPallow 192.168.1.0/24; # 允許整個網段allow 10.0.0.0/8; # 允許內網deny all; # 拒絕其他所有IP}
}
規則執行順序:從上到下,匹配到就停止!
🌐 三、虛擬主機配置
一臺服務器跑多個網站?沒問題!Nginx的虛擬主機功能強大又靈活。
虛擬主機類型對比
┌─────────────────────────────────────────────────────────────────────┐
│ Nginx 虛擬主機類型 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 基于域名 │ │ 基于IP │ │ 基于端口 │ │
│ │ Name-based │ │ IP-based │ │ Port-based │ │
│ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ │
│ │? 同一IP不同域名 │ │? 不同IP同一端口 │ │? 同一IP不同端口 │ │
│ │? www.site1.com │ │? 192.168.1.10 │ │? :8080 │ │
│ │? www.site2.com │ │? 192.168.1.11 │ │? :8081 │ │
│ │ │ │ │ │ │ │
│ │優點:最常用 │ │優點:完全隔離 │ │優點:簡單易配 │ │
│ │缺點:需要域名 │ │缺點:需要多IP │ │缺點:端口管理 │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.1 基于域名的虛擬主機
這是最常用的方式,一個IP綁定多個域名:
# 準備網站目錄
[root@localhost ~]# mkdir -p /var/www/html/{site1,site2}
[root@localhost ~]# echo "Site1 Homepage" > /var/www/html/site1/index.html
[root@localhost ~]# echo "Site2 Homepage" > /var/www/html/site2/index.html
nginx配置:
# 網站1
server {listen 80;server_name www.site1.com;access_log logs/site1.access.log;location / {root /var/www/html/site1;index index.html;}
}# 網站2
server {listen 80;server_name www.site2.com;access_log logs/site2.access.log;location / {root /var/www/html/site2;index index.html;}
}
3.2 基于端口的虛擬主機
當域名不夠用時,可以用不同端口:
server {listen 8080;server_name localhost;location / {root /var/www/html/site1;index index.html;}
}server {listen 8081;server_name localhost;location / {root /var/www/html/site2;index index.html;}
}
🏗? 四、LNMP架構搭建
重頭戲來了!LNMP(Linux + Nginx + MySQL + PHP)是我最喜歡的Web架構組合。
LNMP架構圖
┌─────────────────────────────────────────────────────────────────────┐
│ LNMP 架構圖 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 用戶請求 │ │
│ │ HTTP Request│ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Nginx │ │
│ │ (Web服務器/反向代理) │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ 靜態文件 │ │ PHP請求 │ │ │
│ │ │ 直接返回 │ │ 轉發給FPM │ │ │
│ │ │ .css .js .png │ │ .php文件 │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ └─────────────────────────────────┬───────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ PHP-FPM │ │
│ │ (PHP進程管理器) │ │
│ │ 處理PHP腳本,連接數據庫 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Worker1 │ │ Worker2 │ │ Worker3 │ │ Worker4 │ │ │
│ │ │ Process │ │ Process │ │ Process │ │ Process │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────┬───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ MySQL │ │
│ │ (數據庫服務器) │ │
│ │ 存儲和管理數據 │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 數據庫表: users, posts, products, orders... │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 通信端口: │
│ ? Nginx: 80/443 │
│ ? PHP-FPM: 9000 (FastCGI) │
│ ? MySQL: 3306 │
│ │
└─────────────────────────────────────────────────────────────────────┘
4.1 MySQL安裝配置
# 安裝編譯依賴
[root@localhost ~]# yum -y install ncurses-devel gcc-c++ cmake# 編譯安裝MySQL
[root@localhost ~]# tar -zxf mysql-5.6.36.tar.gz
[root@localhost ~]# cd mysql-5.6.36
[root@localhost mysql-5.6.36]# cmake \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DWITH_EXTRA_CHARSETS=all \-DSYSCONFDIR=/etc[root@localhost mysql-5.6.36]# make && make install
初始化數據庫:
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql# 初始化數據庫
[root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db \--basedir=/usr/local/mysql \--datadir=/usr/local/mysql/data \--user=mysql
4.2 PHP-FPM安裝配置
PHP-FPM是關鍵組件,負責處理PHP請求:
# 安裝PHP依賴
[root@localhost ~]# yum -y install gd libxml2-devel libjpeg-devel libpng-devel# 編譯PHP
[root@localhost ~]# tar -zxf php-5.5.38.tar.gz
[root@localhost ~]# cd php-5.5.38
[root@localhost php-5.5.38]# ./configure \--prefix=/usr/local/php5 \--with-mysql=/usr/local/mysql \--with-mysqli=/usr/local/mysql/bin/mysql_config \--enable-fpm \ # 關鍵:啟用FPM--enable-mbstring \--with-gd[root@localhost php-5.5.38]# make && make install
配置PHP-FPM:
[root@localhost ~]# cd /usr/local/php5/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# useradd -M -s /sbin/nologin php
關鍵配置項:
# php-fpm.conf
pid = run/php-fpm.pid
user = php
group = php
pm.max_children = 50 # 最大子進程數
pm.start_servers = 20 # 啟動時進程數
pm.min_spare_servers = 5 # 最小空閑進程
pm.max_spare_servers = 35 # 最大空閑進程
4.3 Nginx與PHP集成
這是LNMP架構的核心配置:
server {listen 80;server_name www.example.com;root /var/www/html;index index.php index.html;# PHP文件處理location ~ \.php$ {root /var/www/html;fastcgi_pass 127.0.0.1:9000; # PHP-FPM監聽端口fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}# 靜態文件處理location ~ \.(css|js|png|jpg|gif|ico|svg)$ {expires 1y;add_header Cache-Control "public, immutable";}
}
4.4 測試LNMP環境
創建PHP測試文件:
[root@localhost ~]# mkdir /var/www/html
[root@localhost ~]# vim /var/www/html/test.php
<?php
// 測試PHP和MySQL連接
echo "<h1>🎉 LNMP環境測試頁面</h1>";
echo "<hr>";// PHP版本信息
echo "<h2>📋 PHP信息</h2>";
echo "<p><strong>PHP版本:</strong>" . phpversion() . "</p>";
echo "<p><strong>服務器時間:</strong>" . date('Y-m-d H:i:s') . "</p>";// 測試MySQL連接
echo "<h2>🗄? MySQL連接測試</h2>";
$link = mysqli_connect('localhost', 'root', '123456');
if ($link) {echo "<p style='color: green;'>? MySQL連接:<strong>成功</strong></p>";$version = mysqli_get_server_info($link);echo "<p><strong>MySQL版本:</strong>" . $version . "</p>";mysqli_close($link);
} else {echo "<p style='color: red;'>? MySQL連接:<strong>失敗</strong></p>";echo "<p>錯誤信息:" . mysqli_connect_error() . "</p>";
}// 顯示PHP擴展
echo "<h2>🔧 已加載的PHP擴展</h2>";
$extensions = get_loaded_extensions();
echo "<div style='columns: 3; column-gap: 20px;'>";
foreach($extensions as $ext) {echo "<p>? " . $ext . "</p>";
}
echo "</div>";// 服務器信息
echo "<h2>🖥? 服務器信息</h2>";
echo "<p><strong>操作系統:</strong>" . php_uname() . "</p>";
echo "<p><strong>Web服務器:</strong>" . $_SERVER['SERVER_SOFTWARE'] . "</p>";
echo "<p><strong>文檔根目錄:</strong>" . $_SERVER['DOCUMENT_ROOT'] . "</p>";
?>
訪問 http://your-server-ip/test.php
看到成功信息就OK了!
LNMP服務啟動腳本
#!/bin/bash
# LNMP一鍵啟動腳本echo "🚀 啟動LNMP服務..."# 啟動MySQL
echo "啟動MySQL..."
/usr/local/mysql/bin/mysqld_safe --user=mysql &
sleep 3# 啟動PHP-FPM
echo "啟動PHP-FPM..."
/usr/local/php5/sbin/php-fpm# 啟動Nginx
echo "啟動Nginx..."
/usr/local/nginx/sbin/nginxecho "? LNMP服務啟動完成!"
echo "📊 服務狀態檢查:"
echo "MySQL: $(pgrep mysqld > /dev/null && echo '? 運行中' || echo '? 未運行')"
echo "PHP-FPM: $(pgrep php-fpm > /dev/null && echo '? 運行中' || echo '? 未運行')"
echo "Nginx: $(pgrep nginx > /dev/null && echo '? 運行中' || echo '? 未運行')"
📊 五、性能優化技巧
5.1 Nginx狀態監控
啟用狀態統計模塊,實時監控服務器狀態:
location /nginx-status {stub_status on;access_log off;allow 127.0.0.1; # 只允許本機訪問allow 192.168.1.0/24; # 允許內網訪問deny all;
}
訪問 /nginx-status
可以看到:
Active connections: 291
server accepts handled requests16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
狀態說明:
- Active connections: 當前活躍連接數
- accepts: 已接受的連接數
- handled: 已處理的連接數
- requests: 總請求數
- Reading: 正在讀取請求頭的連接數
- Writing: 正在向客戶端寫響應的連接數
- Waiting: 空閑客戶端連接數
5.2 性能調優參數
# 全局優化
user nginx;
worker_processes auto; # 自動檢測CPU核數
worker_cpu_affinity auto; # CPU親和性綁定
worker_rlimit_nofile 65535; # 工作進程最大文件描述符# 事件優化
events {use epoll; # Linux下使用epollworker_connections 65535; # 每個進程最大連接數multi_accept on; # 一次接受多個連接accept_mutex off; # 關閉accept鎖
}http {# 基礎優化sendfile on; # 開啟高效文件傳輸tcp_nopush on; # 優化網絡包傳輸tcp_nodelay on; # 減少網絡延遲keepalive_timeout 30; # 連接保持時間keepalive_requests 1000; # 每個連接最大請求數# 緩存優化open_file_cache max=100000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on;# Gzip壓縮gzip on;gzip_vary on;gzip_min_length 1024;gzip_comp_level 6;gzip_typestext/plaintext/csstext/xmltext/javascriptapplication/jsonapplication/javascriptapplication/xml+rssapplication/atom+xmlimage/svg+xml;# 緩沖區優化client_body_buffer_size 128k;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 50m;
}
5.3 系統內核優化
# /etc/sysctl.conf 系統內核優化# 網絡優化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65535# 文件描述符優化
fs.file-max = 6815744# 應用生效
sysctl -p
5.4 PHP-FPM性能優化
# php-fpm.conf 優化配置[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = warning[www]
user = php
group = php
listen = 127.0.0.1:9000
listen.backlog = 65535# 進程管理優化
pm = dynamic # 動態進程管理
pm.max_children = 100 # 最大子進程數
pm.start_servers = 20 # 啟動時進程數
pm.min_spare_servers = 10 # 最小空閑進程
pm.max_spare_servers = 30 # 最大空閑進程
pm.max_requests = 1000 # 每個進程最大請求數# 慢日志
slowlog = log/slow.log
request_slowlog_timeout = 2# 資源限制
rlimit_files = 65535
rlimit_core = 0
🛡? 六、安全加固
6.1 隱藏版本信息
http {server_tokens off; # 隱藏Nginx版本# 自定義Server頭more_set_headers "Server: WebServer";
}
6.2 防止惡意請求
http {# 限制請求方法map $request_method $not_allowed_method {default 1;GET 0;POST 0;HEAD 0;}# 限制User-Agentmap $http_user_agent $blocked_agent {default 0;~*malicious 1;~*bot 1;~*crawler 1;}server {# 拒絕不允許的請求方法if ($not_allowed_method) {return 405;}# 拒絕惡意User-Agentif ($blocked_agent) {return 403;}# 防止目錄遍歷location ~ /\. {deny all;access_log off;log_not_found off;}# 限制文件上傳大小client_max_body_size 10m;}
}
6.3 SSL/TLS配置
server {listen 443 ssl http2;server_name www.example.com;# SSL證書配置ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;# SSL優化ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers off;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;# 安全頭add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;add_header X-Frame-Options DENY always;add_header X-Content-Type-Options nosniff always;add_header X-XSS-Protection "1; mode=block" always;# HTTP重定向到HTTPSerror_page 497 https://$server_name$request_uri;
}
📈 七、監控與日志
7.1 日志格式優化
http {# 自定義日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''$request_time $upstream_response_time';# JSON格式日志(便于分析)log_format json escape=json '{''"time": "$time_iso8601",''"remote_addr": "$remote_addr",''"request": "$request",''"status": $status,''"body_bytes_sent": $body_bytes_sent,''"request_time": $request_time,''"upstream_response_time": "$upstream_response_time"''}';access_log logs/access.log main;error_log logs/error.log warn;
}
7.2 日志輪轉
# /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {daily # 每天輪轉missingok # 文件不存在不報錯rotate 30 # 保留30天compress # 壓縮舊日志delaycompress # 延遲壓縮notifempty # 空文件不輪轉create 644 nginx nginx # 創建新文件權限postrotate/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :endscript
}
🎯 總結
通過這次完整的實戰分享,我們從零開始搭建了一個完整的LNMP環境,涵蓋了:
? 核心知識點
-
Nginx基礎安裝
- 編譯安裝與配置
- 服務腳本創建
- 配置文件結構理解
-
訪問控制
- 基于用戶認證
- 基于IP地址控制
- 安全策略配置
-
虛擬主機
- 基于域名的虛擬主機
- 基于端口的虛擬主機
- 多站點管理
-
LNMP架構
- MySQL數據庫安裝
- PHP-FPM配置優化
- Nginx與PHP集成
-
性能優化
- 內核參數調優
- Nginx配置優化
- 緩存策略配置
-
安全加固
- 版本信息隱藏
- 惡意請求防護
- SSL/TLS配置
🚀 實戰經驗分享
┌─────────────────────────────────────────────────────────────┐
│ Nginx實戰經驗總結 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 💡 關鍵要點: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. 安全第一:專用用戶 + 權限控制 │ │
│ │ 2. 性能優化:合理配置進程數和連接數 │ │
│ │ 3. 監控重要:日志分析 + 狀態監控 │ │
│ │ 4. 架構清晰:理解各組件協作關系 │ │
│ │ 5. 持續學習:跟進新版本和最佳實踐 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 🎯 生產環境建議: │
│ ? worker_processes = CPU核數 │
│ ? worker_connections = 10240-65535 │
│ ? 開啟gzip壓縮節省帶寬 │
│ ? 配置SSL證書提升安全性 │
│ ? 定期備份配置文件 │
│ ? 監控服務器資源使用情況 │
│ │
└─────────────────────────────────────────────────────────────┘
🔧 常用命令速查
# Nginx服務管理
nginx -t # 檢查配置文件語法
nginx -s reload # 重載配置(不中斷服務)
nginx -s stop # 停止服務
nginx -s quit # 優雅停止
nginx -V # 查看編譯參數# 進程管理
ps aux | grep nginx # 查看Nginx進程
netstat -tlnp | grep :80 # 查看80端口占用
lsof -i :80 # 查看80端口進程# 日志分析
tail -f /usr/local/nginx/logs/access.log # 實時查看訪問日志
tail -f /usr/local/nginx/logs/error.log # 實時查看錯誤日志
Nginx真的是一個非常優秀的Web服務器,在高并發場景下表現尤其出色。掌握了這些核心技能,相信大家在實際項目中能夠游刃有余地使用Nginx,搭建出高性能、高可用的Web服務!
記住:實踐是最好的老師,多動手操作,多在生產環境中驗證,才能真正掌握Nginx的精髓。
🎉 恭喜你完成了Nginx從入門到實戰的完整學習!繼續加油!