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

news2025/6/5 20:16:25

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 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环境,涵盖了:

✅ 核心知识点

  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.coloradmin.cn/o/2398627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试八股--08-数据结构和算法篇

1、怎么理解时间复杂度和空间复杂度 时间复杂度和空间复杂度一般是针对算法而言&#xff0c;是衡量一个算法是否高效的重要标准。先纠正一个误区&#xff0c;时间复杂度并不是算法执行的时间&#xff0c;在纠正一个误区&#xff0c;算法不单单指冒泡排序之类的&#xff0c;一个…

Java面试八股--06-Linux篇

目录 一、Git 1、工作中git开发使用流程&#xff08;命令版本描述&#xff09; 2.Reset与Rebase&#xff0c;Pull与Fetch的区别 3、git merge和git rebase的区别 4、git如何解决代码冲突 5、项目开发时git分支情况 二、Linux 1、Linux常用的命令 2、如何查看测试项目的…

dvwa7——SQL Injection

LOW&#xff1a; f12打开hackbar 一&#xff1a;判断注入类型 输入id1报错 闭合单引号 &#xff0c;页面恢复正常 所以为单引号字符型 二&#xff1a;开始攻击 1.判断列数 ?id1 order by 2-- 到3的时候开始报错&#xff0c;所以一共两列 2.爆回显位置 ?id-1 union s…

sqlite3 命令行工具详细介绍

一、启动与退出 启动数据库连接 sqlite3 [database_file] # 打开/创建数据库文件&#xff08;如 test.db&#xff09; sqlite3 # 启动临时内存数据库 (:memory:) sqlite3 :memory: # 显式启动内存数据库文件不存在时自动创建不指定文件名则使用临时内…

ubuntu 22.04 编译安装nignx 报错 openssl 问题

前言 Ubuntu 20.04 中安装 Nginx (通过传包编译的方式)、开启关闭防火墙、开放端口号 在ubuntu 22.04.3 服务器上照着上面的文章 通过传包编译的方式安装nginx-1.18.0 的时候报错&#xff0c;报错内容如下&#xff1a; src/event/ngx_event_openssl.c: In function ‘ngx_ssl…

线程相关面试题

提示&#xff1a;线程相关面试题&#xff0c;持续更新中 文章目录 一、Java线程池1、Java线程池有哪些核心参数&#xff0c;分别有什么的作用&#xff1f;2、线程池有哪些拒绝策略&#xff1f;3、说一说线程池的执行流程?4、线程池核心线程数怎么设置呢&#xff1f;4、Java线程…

pikachu通关教程-目录遍历漏洞(../../)

目录遍历漏洞也可以叫做信息泄露漏洞、非授权文件包含漏洞等. 原理:目录遍历漏洞的原理比较简单&#xff0c;就是程序在实现上没有充分过滤用户输入的../之类的目录跳转符&#xff0c;导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。 这里的目录跳转符可以是../…

Maven-生命周期

目录 1.项目对象模型 2.依赖管理模型 3.仓库&#xff1a;用于存储资源&#xff0c;管理各种jar包 4.本地仓库路径 1.项目对象模型 2.依赖管理模型 3.仓库&#xff1a;用于存储资源&#xff0c;管理各种jar包 4.本地仓库路径

Matlab实现LSTM-SVM回归预测,作者:机器学习之心

Matlab实现LSTM-SVM回归预测&#xff0c;作者&#xff1a;机器学习之心 目录 Matlab实现LSTM-SVM回归预测&#xff0c;作者&#xff1a;机器学习之心效果一览基本介绍程序设计参考资料 效果一览 基本介绍 代码主要功能 该代码实现了一个LSTM-SVM回归预测模型&#xff0c;核心流…

Spring Boot 自动配置原理:从入门到精通

Spring Boot 的自动配置是其核心特性之一&#xff0c;它极大地简化了 Spring 应用的开发&#xff0c;让开发者可以专注于业务逻辑&#xff0c;而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理&#xff0c;帮助你理解其工作机制&#xff0c;并能灵活运用…

腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布

近日&#xff0c;腾讯的 ovCompose 和 Kuikly 都发布了全新开源更新&#xff0c;其中 Kuikly 在之前我们聊过&#xff0c;本次 Kuikly 主要是正式开源鸿蒙支持部分和 Compose DSL 的相关支持&#xff0c;而 ovCompose 是腾讯视频团队基于 Compose Multiplatform 生态推出的跨平…

PYTHON调用讯飞C/C++动态库实现离线语音合成并且实时播放

语音合成(Text-to-Speech, TTS)技术在现代应用中扮演着越来越重要的角色&#xff0c;从智能客服到有声读物&#xff0c;从导航系统到辅助工具&#xff0c;TTS技术无处不在。本文将详细介绍如何使用Python结合科大讯飞的离线SDK实现一个本地化的语音合成系统。 技术背景 离线语…

黑马Java面试笔记之 消息中间件篇(RabbitMQ)

一. 消息丢失问题 RabbitMQ如何保证消息不丢失&#xff1f; 使用场景有&#xff1a; 异步发送&#xff08;验证码、短信、邮件... &#xff09;MYSQL和Redis&#xff0c;ES之间的数据同步分布式事务削峰填谷...... 消息丢失原因会有三种情况&#xff0c;分别分析一下 1.1 生…

Redisson学习专栏(五):源码阅读及Redisson的Netty通信层设计

文章目录 前言一、分布式锁核心实现&#xff1a;RedissonLock源码深度解析1.1 加锁机制&#xff1a;原子性与重入性实现1.2 看门狗机制&#xff1a;锁自动续期设计1.3 解锁机制&#xff1a;安全释放与通知1.4 锁竞争处理&#xff1a;等待队列与公平性1.5 容错机制&#xff1a;异…

结合 AI 生成 mermaid、plantuml 等图表

AI 画图 AI 画图并不是真的让 AI 画一个图片&#xff0c;而是让 AI 根据你的需求&#xff0c;生成对应的需求文本&#xff0c;再根据 “文本画图” 来生成图片。 Mermaid mermaid 支持流程图、时序图、架构图等等多种图片绘制。当然最终生成的效果和样式会根据不同的“文本代…

R语言使用随机过采样(Random Oversampling)平衡数据集

随机过采样&#xff08;Random Oversampling&#xff09;是一种用于平衡数据集的技术&#xff0c;常用于机器学习中处理类别不平衡问题。当某个类别的样本数量远少于其他类别时&#xff08;例如二分类中的正负样本比例悬殊&#xff09;&#xff0c;模型可能会偏向多数类&#x…

【Kotlin】高阶函数Lambda内联函数

【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 【Kotlin】高阶函数&Lambda&内联函数 【Kotlin】表达式&关键字 文章目录 函数还是属性高阶函数抽象和高阶函数实例&#xff1a; 函数作为参数的需求方法引用表达式更多使用场…

从0开始学vue:vue3和vue2的关系

一、版本演进关系1. 继承关系2. 版本生命周期 二、核心差异对比三、关键演进方向1. Composition API2. 性能优化 四、迁移策略1. 兼容构建模式2. 关键破坏性变更 五、生态演进1. 官方库升级2. 构建工具链 六、选型建议1. 新项目2. 现有项目 七、未来展望 一、版本演进关系 1. …

MySQL关系型数据库学习

学习参考链接&#xff1a;https://www.runoob.com/mysql/mysql-tutorial.html Windows 安装MYSQL服务端的步骤&#xff1a;https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念学习 MySQL 是一种关联数据库管理系统&#xff0c;关联数据库将数据保存在不…

嵌入式硬件篇---龙芯2k1000串口

针对串口错误 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解决方法 硬件方面 检查连接 确认串口设备&#xff08;如串口线、连接的模块等&#xff09;与龙芯设备之间的物理连接是否牢固&#xf…