🏡作者主页:点击!
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 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
# 添加执行权限并注册服务
[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; # 拒绝特定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绑定多个域名:
# 准备网站目录
[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/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状态监控
启用状态统计模块,实时监控服务器状态:
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 性能调优参数
# 全局优化
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 系统内核优化
# /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-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配置
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 日志格式优化
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从入门到实战的完整学习!继续加油!