Nginx網站服務:從入門到LNMP架構實戰

https://i-blog.csdnimg.cn/blog_migrate/58966ddd9b29aabe8841f5ec34f0d31c.gif
🏡作者主頁:點擊!
Nginx-從零開始的服務器之旅專欄:點擊!
🐧Linux高級管理防護和群集專欄:點擊!
??創作時間:2025年5月30日14點22分

https://i-blog.csdnimg.cn/blog_migrate/58966ddd9b29aabe8841f5ec34f0d31c.gif

前言

說起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環境,涵蓋了:

? 核心知識點

  1. Nginx基礎安裝

    • 編譯安裝與配置
    • 服務腳本創建
    • 配置文件結構理解
  2. 訪問控制

    • 基于用戶認證
    • 基于IP地址控制
    • 安全策略配置
  3. 虛擬主機

    • 基于域名的虛擬主機
    • 基于端口的虛擬主機
    • 多站點管理
  4. LNMP架構

    • MySQL數據庫安裝
    • PHP-FPM配置優化
    • Nginx與PHP集成
  5. 性能優化

    • 內核參數調優
    • Nginx配置優化
    • 緩存策略配置
  6. 安全加固

    • 版本信息隱藏
    • 惡意請求防護
    • 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從入門到實戰的完整學習!繼續加油!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85047.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【maker-pdf 文檔文字識別(包含ocr),安裝使用完整教程】

安裝環境 conda create -n maker-pdf python3.12 conda activate marker-pdf pip install modelscope pip install marker-pdf -U下載模型 from modelscope import snapshot_downloadmodel_root "models" snapshot_download("Lixiang/marker-pdf", loca…

C# 類和繼承(所有類都派生自object類)

所有類都派生自object類 除了特殊的類object&#xff0c;所有的類都是派生類&#xff0c;即使它們沒有基類規格說明。類object是唯 一的非派生類&#xff0c;因為它是繼承層次結構的基礎。 沒有基類規格說明的類隱式地直接派生自類object。不加基類規格說明只是指定object為 基…

尚硅谷redis7 90-92 redis集群分片之集群擴容

90 redis集群分片之集群擴容 三主三從不夠用了&#xff0c;進行擴容變為4主4從 問題&#xff1a;1.新建兩個redis實例&#xff0c;怎么加入原有集群&#xff1f;2.原有的槽位分3段&#xff0c;又加進來一個槽位怎么算&#xff1f; 新建6387、6388兩個服務實例配置文件新建后啟…

尚硅谷-尚庭公寓部署文檔

文章目錄 整合版部署文檔部署架構圖1. 項目目錄結構增加注釋的 Dockerfile 配置(1) 后端服務1 Dockerfile (backend/service1/Dockerfile)(2) 后端服務2 Dockerfile (backend/service2/Dockerfile) Dockerfile 配置說明重要注意事項3. Nginx 配置(1) 主配置文件 (nginx/nginx.c…

Android Studio 介紹

如何關閉或徹底刪除一個工程 基于Android Studio的android入門——如何關閉或徹底刪除一個工程 搜索內容 Android Studio高效指南&#xff1a;快速查找技巧大揭秘 build命令&#xff1a;gradle app:assembleDebug 命令解析 1. 命令結構與作用 核心功能&#xff1a;該命令…

JAVA與C語言之間的差異(一)

一、代碼習慣以及主函數 JAVA中{在使用的時候不要換行 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");}} 其次&#xff0c;以main函數為主函數&#xff1a; public …

華為OD機試真題——開放日活動/取出盡量少的球(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《開放…

我的3種AI寫作節奏搭配模型,適合不同類型寫作者

—不用內耗地高效寫完一篇內容&#xff0c;原來可以這樣搭配AI ?? 開場&#xff1a;為什么要“搭配節奏”寫作&#xff1f; 很多人以為用AI寫作&#xff0c;就是丟一句提示詞&#xff0c;然后“等它寫完”。 但你有沒有遇到這些情況&#xff1a; AI寫得很快&#xff0c;學境…

【知識點】第1章:程序設計基本方法

文章目錄 知識點整理計算機的概念程序設計語言Python 語言概述Python 語言開發環境配置程序的基本編寫方法 練習題簡答題判斷題 知識點整理 計算機的概念 計算機的定義&#xff1a;計算機是根據指令操作數據的設備。 計算機的兩個基本特性&#xff1a; 功能性&#xff1a;計…

const ‘不可變’到底是值不變還是地址不變

const的基礎規則 聲明時必須初始化? const a; // ? 報錯&#xff1a;Missing initializer in const declaration const b 10; // ? 正確塊級作用域?&#xff08;const 的作用域僅限于聲明它的代碼塊&#xff09; if (true) {const x 100; } console.log(x); // ? 報錯…

Netty 實戰篇:為自研 RPC 框架加入異步調用與 Future 支持

我們在上篇實現了一個輕量級 RPC 框架&#xff0c;現在要進一步優化 —— 加入異步響應支持&#xff0c;讓 RPC 通信變得真正高效、非阻塞、支持并發。 一、為什么需要異步調用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次發送請求后&#xff0c;必須等待服…

for(auto a:b)和for(auto a:b)的區別

#include<iostream> using namespace std; int main() {string s( "hello world" );for (auto c:s)c t ;cout<<s<<endl; //結果為hello worldfor (auto &c:s)c t ;cout<<s<<endl; //結果為ttttttttttt }for(auto a:b)中b為一…

超級對話2:大跨界且大綜合的學問融智學應用場景述評(不同第三方的回應)之二

摘要&#xff1a;《人機協同文明升維行動框架》提出以HIAICI/W公式推動認知革命&#xff0c;構建三大落地場景&#xff1a;1&#xff09;低成本認知增強神經接口實現300%學習效率提升&#xff1b;2&#xff09;全球學科活動化閃電戰快速轉化知識體系&#xff1b;3&#xff09;人…

多方法解決MNIST數字識別

全連接層 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.optim as optim from tqdm import tqdm # 用于進度條顯示 import os# 定義數據預處理(標準化+Tensor轉換) transform = transforms.Compose([transforms.ToTensor…

安裝 Node.js 和配置 cnpm 鏡像源

一、安裝 Node.js 方式一&#xff1a;官網下載&#xff08;適合所有系統&#xff09; 訪問 Node.js 官網 推薦選擇 LTS&#xff08;長期支持&#xff09;版本&#xff0c;點擊下載安裝包。 根據系統提示一步步完成安裝。 方式二&#xff1a;通過包管理器安裝&#xff08;建…

vue 自定義組件的事件綁定

基本知識點 &#x1f3af;什么是自定義事件 自定義事件是子組件向父組件發送消息的機制&#xff0c;通常用于通知父組件發生了某些行為或狀態變化。 &#x1f4cc; 基本語法 子組件觸發事件&#xff08;$emit&#xff09; this.$emit(事件名, 參數);或在 const emit de…

進程同步機制-信號量機制-記錄型信號量機制中的的wait和signal操作

wait和signal是記錄型信號量機制中用于實現進程同步與互斥的兩個重要操作&#xff0c; wait 操作 wait(semaphores *S) {S->value --;if (S->value<0) block(S->list) }請求資源&#xff1a;S->value --; 這一步表示進程請求一個單位的資源&#xff0c;將信號…

sd webui 安裝sd-webui-TemporalKit 加載報錯解決辦法

ModuleNotFoundError: No module named moviepy.editer 報錯內容類似上面截圖&#xff0c;我的已經解決&#xff0c;暫時無法截圖了 處理方法&#xff1a; 重點說明&#xff1a;插件目錄必須是TemporalKit&#xff0c;不能更改 進入到安裝目錄&#xff1a;extensions\Tempor…

decimal.js庫處理js浮點數精度誤差問題

1、經常遇到前端計算金額的時候出現精度誤差問題&#xff0c;導致前后端計算的金額不一致導致校驗過不去的情況&#xff0c;相信有不少人寫過Math.floor(e*100)/100來實現保留2位小數&#xff0c;但是這么寫就會出現上面的精度問題。怎么解決呢&#xff1f;這里使用的是decimal…

如何將 WSL 的 Ubuntu-24.04 遷移到其他電腦

在使用 Windows Subsystem for Linux (WSL) 時&#xff0c;我們可能會遇到需要將現有的 WSL 環境遷移到其他電腦的情況。無論是為了備份、更換設備&#xff0c;還是在不同電腦之間共享開發環境&#xff0c;掌握遷移 WSL 子系統的方法都是非常有用的。本文將以 Ubuntu-24.04 為例…