Nginx网站服务:从入门到LNMP架构实战


🏡作者主页:点击!
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

首先我们需要准备编译环境,这一步很关键:

bash 复制代码
# 安装必要的依赖包
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc++ gcc

为什么要安装这些包?

  • pcre-devel:支持正则表达式
  • zlib-devel:支持gzip压缩
  • gcc++/gcc:编译器

接下来创建专用用户(安全第一):

bash 复制代码
# 创建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 编译配置

这里是关键步骤,配置参数要仔细:

bash 复制代码
[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

小技巧:创建软链接方便使用

bash 复制代码
[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;        │ │ │ │ │    │
│  │ │     │ │     │ }                           │ │ │ │ │    │
│  │ │     │ │     └─────────────────────────────┘ │ │ │ │    │
│  │ │     │ │ }                                   │ │ │ │    │
│  │ │     │ └─────────────────────────────────────┘ │ │ │    │
│  │ │     └─────────────────────────────────────────┘ │ │    │
│  │ │ }                                               │ │    │
│  │ └─────────────────────────────────────────────────┘ │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

核心配置示例

bash 复制代码
# 全局配置
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 系统服务脚本

为了方便管理,我们创建一个系统服务脚本:

bash 复制代码
[root@localhost ~]# vim /etc/init.d/nginx
bash 复制代码
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control Script

PROG="/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
bash 复制代码
# 添加执行权限并注册服务
[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;                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

有时候我们需要对某些目录进行保护,这时候用户认证就派上用场了:

bash 复制代码
# 安装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

设置文件权限(重要):

bash 复制代码
[root@localhost ~]# chmod 400 /usr/local/nginx/passwd.db
[root@localhost ~]# chown nginx /usr/local/nginx/passwd.db

配置nginx.conf

bash 复制代码
server {
    location /admin {
        auth_basic "管理员区域";                    # 认证提示信息
        auth_basic_user_file /usr/local/nginx/passwd.db;  # 密码文件路径
        root html;
        index index.html;
    }
}

2.2 基于IP的访问控制

这个功能在实际项目中超级实用,比如只允许办公网IP访问后台:

bash 复制代码
server {
    location /admin {
        deny  192.168.1.100;      # 拒绝特定IP
        allow 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绑定多个域名:

bash 复制代码
# 准备网站目录
[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配置

bash 复制代码
# 网站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 基于端口的虚拟主机

当域名不够用时,可以用不同端口:

bash 复制代码
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安装配置

bash 复制代码
# 安装编译依赖
[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

初始化数据库

bash 复制代码
[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请求:

bash 复制代码
# 安装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

bash 复制代码
[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

关键配置项

bash 复制代码
# 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架构的核心配置:

bash 复制代码
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测试文件:

bash 复制代码
[root@localhost ~]# mkdir /var/www/html
[root@localhost ~]# vim /var/www/html/test.php
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服务启动脚本

bash 复制代码
#!/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/nginx

echo "✅ 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状态监控

启用状态统计模块,实时监控服务器状态:

bash 复制代码
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 requests
 16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106

状态说明

  • Active connections: 当前活跃连接数
  • accepts: 已接受的连接数
  • handled: 已处理的连接数
  • requests: 总请求数
  • Reading: 正在读取请求头的连接数
  • Writing: 正在向客户端写响应的连接数
  • Waiting: 空闲客户端连接数

5.2 性能调优参数

bash 复制代码
# 全局优化
user nginx;
worker_processes auto;          # 自动检测CPU核数
worker_cpu_affinity auto;       # CPU亲和性绑定
worker_rlimit_nofile 65535;     # 工作进程最大文件描述符

# 事件优化
events {
    use epoll;                  # Linux下使用epoll
    worker_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_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/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 系统内核优化

bash 复制代码
# /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性能优化

bash 复制代码
# 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 隐藏版本信息

bash 复制代码
http {
    server_tokens off;          # 隐藏Nginx版本
    
    # 自定义Server头
    more_set_headers "Server: WebServer";
}

6.2 防止恶意请求

bash 复制代码
http {
    # 限制请求方法
    map $request_method $not_allowed_method {
        default 1;
        GET 0;
        POST 0;
        HEAD 0;
    }
    
    # 限制User-Agent
    map $http_user_agent $blocked_agent {
        default 0;
        ~*malicious 1;
        ~*bot 1;
        ~*crawler 1;
    }
    
    server {
        # 拒绝不允许的请求方法
        if ($not_allowed_method) {
            return 405;
        }
        
        # 拒绝恶意User-Agent
        if ($blocked_agent) {
            return 403;
        }
        
        # 防止目录遍历
        location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
        }
        
        # 限制文件上传大小
        client_max_body_size 10m;
    }
}

6.3 SSL/TLS配置

bash 复制代码
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重定向到HTTPS
    error_page 497 https://$server_name$request_uri;
}

📈 七、监控与日志

7.1 日志格式优化

bash 复制代码
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 日志轮转

bash 复制代码
# /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证书提升安全性                                     │
│  • 定期备份配置文件                                          │
│  • 监控服务器资源使用情况                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🔧 常用命令速查

bash 复制代码
# 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从入门到实战的完整学习!继续加油!

相关推荐
七夜zippoe8 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
yunteng5218 小时前
通用架构(同城双活)(单点接入)
架构·同城双活·单点接入
麦聪聊数据9 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
Fcy6489 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满9 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
程序员侠客行9 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Harvey90310 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技11 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
bobuddy11 小时前
射频收发机架构简介
架构·射频工程