Linux运维必备:Nginx Web服务器安装部署与配置详解

一、Nginx概述与环境准备

1.1 Nginx简介

什么是Nginx

Nginx(读作"engine-x")是一款轻量级的Web服务器、反向代理服务器,由俄罗斯程序员Igor Sysoev于2004年开发。作为目前最流行的Web服务器之一,Nginx以其高性能、高并发、低内存消耗等特点在互联网领域广泛应用。

Nginx的核心优势

  • 高并发处理能力:采用异步非阻塞的事件驱动模型,单机可处理数万并发连接
  • 内存消耗低:相比Apache等传统Web服务器,资源占用更少
  • 高可用性:稳定性极佳,可7×24小时不间断运行
  • 模块化设计:功能通过模块实现,可灵活扩展
  • 配置简洁:配置文件语法简单易懂

适用场景分析

  • 静态文件服务器
  • 反向代理服务器
  • 负载均衡器
  • HTTP缓存服务器
  • API网关

1.2 系统环境要求

支持的Linux发行版

  • Ubuntu 18.04/20.04/22.04 LTS
  • CentOS 7/8, RHEL 7/8/9
  • Debian 10/11
  • SUSE Linux Enterprise Server

硬件配置建议

最小配置:
- CPU: 1核心
- 内存: 512MB
- 存储: 10GB

生产环境推荐:
- CPU: 2核心以上
- 内存: 2GB以上
- 存储: 50GB以上SSD

必要的系统权限

  • root权限或sudo权限
  • 网络连接权限
  • 80/443端口访问权限

1.3 环境检查与准备

系统版本确认

# 查看系统版本
cat /etc/os-release
uname -a

# 更新系统包
# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL
sudo yum update -y
# 或 CentOS 8+
sudo dnf update -y

端口占用检查

# 检查80和443端口是否被占用
netstat -tlnp | grep -E ':80|:443'
ss -tlnp | grep -E ':80|:443'

防火墙配置准备

# Ubuntu/Debian (UFW)
sudo ufw allow 'Nginx Full'
sudo ufw reload

# CentOS/RHEL (Firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

二、Nginx安装方法详解

2.1 包管理器安装(推荐新手)

Ubuntu/Debian系统安装

# 更新包索引
sudo apt update

# 安装Nginx
sudo apt install nginx -y

# 验证安装
nginx -v

# 查看安装路径和配置
nginx -V

CentOS/RHEL系统安装

# CentOS 7/RHEL 7
sudo yum install epel-release -y
sudo yum install nginx -y

# CentOS 8+/RHEL 8+
sudo dnf install nginx -y

# 验证安装
nginx -v

安装版本选择

官方仓库通常提供稳定版本,如需最新版本可添加官方源:

# Ubuntu添加官方源
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo add-apt-repository "deb https://nginx.org/packages/ubuntu/ $(lsb_release -cs) nginx"
sudo apt update
sudo apt install nginx

# CentOS添加官方源
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

sudo yum install nginx -y

2.2 源码编译安装(推荐生产环境)

下载源码包

# 创建工作目录
mkdir -p /usr/local/src
cd /usr/local/src

# 下载最新稳定版本
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

编译环境准备

# Ubuntu/Debian安装编译依赖
sudo apt install build-essential libpcre3-dev libssl-dev zlib1g-dev libgd-dev libxml2-dev libxslt1-dev -y

# CentOS/RHEL安装编译依赖
sudo yum groupinstall "Development Tools" -y
sudo yum install pcre-devel openssl-devel zlib-devel gd-devel libxml2-devel libxslt-devel -y

配置编译参数

./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --with-http_auth_request_module \
    --with-http_image_filter_module \
    --with-file-aio \
    --with-http_v2_module \
    --with-threads \
    --with-stream \
    --with-stream_ssl_module \
    --with-http_slice_module

编译与安装过程

# 编译
make -j$(nproc)

# 安装
sudo make install

# 创建nginx用户
sudo useradd -r -s /sbin/nologin nginx

# 创建systemd服务文件
sudo tee /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

# 重载systemd配置
sudo systemctl daemon-reload

2.3 Docker容器化安装

Docker环境准备

# 安装Docker(Ubuntu)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

官方镜像使用

# 拉取官方Nginx镜像
docker pull nginx:latest

# 运行Nginx容器
docker run -d \
    --name nginx-server \
    -p 80:80 \
    -p 443:443 \
    -v /etc/nginx:/etc/nginx \
    -v /var/log/nginx:/var/log/nginx \
    -v /usr/share/nginx/html:/usr/share/nginx/html \
    nginx:latest

自定义镜像构建

# Dockerfile
FROM nginx:alpine

# 复制自定义配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf

# 复制静态文件
COPY html/ /usr/share/nginx/html/

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]
# 构建镜像
docker build -t custom-nginx .

# 运行容器
docker run -d --name my-nginx -p 80:80 custom-nginx

三、Nginx核心配置详解

3.1 配置文件结构

主配置文件nginx.conf

Nginx的主配置文件通常位于:

  • 包管理器安装:/etc/nginx/nginx.conf
  • 源码编译安装:/usr/local/nginx/conf/nginx.conf

配置文件语法规则

# 注释以#开头
# 指令以分号结尾
# 配置块使用大括号{}包围
# 指令格式:指令名 参数1 参数2 ... ;

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;

配置块hierarchy结构

# 全局块
user nginx;
worker_processes auto;

# events块
events {
    worker_connections 1024;
    use epoll;
}

# http块
http {
    # http全局块
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # server块
    server {
        # server全局块
        listen 80;
        server_name example.com;
        
        # location块
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
        
        location /api {
            proxy_pass http://backend;
        }
    }
}

3.2 基础配置项

全局配置参数

# 运行用户
user nginx;

# 工作进程数(建议设置为CPU核心数)
worker_processes auto;

# 错误日志
error_log /var/log/nginx/error.log warn;

# PID文件
pid /var/run/nginx.pid;

# 最大文件描述符数
worker_rlimit_nofile 65535;

Events配置块

events {
    # 每个进程的最大连接数
    worker_connections 1024;
    
    # 事件驱动模型(Linux使用epoll)
    use epoll;
    
    # 允许同时接受多个连接
    multi_accept on;
}

HTTP配置块

http {
    # MIME类型
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志
    access_log /var/log/nginx/access.log main;

    # 发送文件优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 连接超时
    keepalive_timeout 65;

    # 隐藏版本号
    server_tokens off;

    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
}

3.3 虚拟主机配置

基于域名的虚拟主机

# 网站1
server {
    listen 80;
    server_name example1.com www.example1.com;
    root /var/www/example1;
    index index.html index.htm;
    
    access_log /var/log/nginx/example1.access.log;
    error_log /var/log/nginx/example1.error.log;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 网站2
server {
    listen 80;
    server_name example2.com www.example2.com;
    root /var/www/example2;
    index index.html index.htm;
    
    access_log /var/log/nginx/example2.access.log;
    error_log /var/log/nginx/example2.error.log;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

基于端口的虚拟主机

# 端口8080
server {
    listen 8080;
    server_name localhost;
    root /var/www/port8080;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 端口8081
server {
    listen 8081;
    server_name localhost;
    root /var/www/port8081;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

SSL/HTTPS配置

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    # SSL证书配置
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    # SSL安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;
    
    root /var/www/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

四、Nginx服务管理

4.1 服务控制命令

启动、停止、重启服务

# Systemd管理(推荐)
sudo systemctl start nginx      # 启动
sudo systemctl stop nginx       # 停止
sudo systemctl restart nginx    # 重启
sudo systemctl reload nginx     # 重载配置
sudo systemctl status nginx     # 查看状态

# 直接命令管理
sudo nginx                      # 启动
sudo nginx -s stop             # 快速停止
sudo nginx -s quit             # 优雅停止
sudo nginx -s reload           # 重载配置
sudo nginx -s reopen           # 重新打开日志文件

配置文件语法检查

# 检查配置文件语法
sudo nginx -t

# 检查特定配置文件
sudo nginx -t -c /path/to/nginx.conf

# 显示详细信息
sudo nginx -T

平滑重载配置

# 测试配置并重载
sudo nginx -t && sudo nginx -s reload

# 或使用systemd
sudo nginx -t && sudo systemctl reload nginx

4.2 开机自启动配置

Systemd服务配置

# 启用开机自启动
sudo systemctl enable nginx

# 禁用开机自启动
sudo systemctl disable nginx

# 查看启动状态
sudo systemctl is-enabled nginx

传统init.d脚本配置

# CentOS/RHEL 6及更早版本
sudo chkconfig nginx on

# Ubuntu使用update-rc.d
sudo update-rc.d nginx enable

服务状态监控

# 查看详细状态
sudo systemctl status nginx -l

# 查看最近日志
sudo journalctl -u nginx --since "1 hour ago"

# 实时监控日志
sudo journalctl -u nginx -f

4.3 日志管理

访问日志配置

http {
    # 定义日志格式
    log_format combined '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent"';
    
    log_format json escape=json '{'
                              '"time": "$time_iso8601",'
                              '"remote_addr": "$remote_addr",'
                              '"request": "$request",'
                              '"status": $status,'
                              '"body_bytes_sent": $body_bytes_sent,'
                              '"http_referer": "$http_referer",'
                              '"http_user_agent": "$http_user_agent"'
                              '}';
    
    # 访问日志
    access_log /var/log/nginx/access.log combined;
    
    server {
        # 单独站点日志
        access_log /var/log/nginx/site.access.log json;
    }
}

错误日志配置

# 全局错误日志
error_log /var/log/nginx/error.log warn;

server {
    # 站点错误日志
    error_log /var/log/nginx/site.error.log;
    
    # 关闭特定location的日志
    location /health {
        access_log off;
        return 200 "OK";
    }
}

日志轮转设置

# 创建logrotate配置
sudo tee /etc/logrotate.d/nginx << 'EOF'
/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 nginx adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}
EOF

# 手动测试轮转
sudo logrotate -d /etc/logrotate.d/nginx
sudo logrotate -f /etc/logrotate.d/nginx

五、常见应用场景配置

5.1 静态文件服务

静态网站部署

server {
    listen 80;
    server_name static.example.com;
    root /var/www/static;
    index index.html index.htm;
    
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        add_header Pragma public;
    }
    
    # Gzip压缩
    location ~* \.(css|js|html|htm)$ {
        gzip_static on;
        expires 30d;
    }
    
    # 安全配置
    location ~ /\. {
        deny all;
    }
}

文件下载服务配置

server {
    listen 80;
    server_name download.example.com;
    root /var/www/downloads;
    
    # 下载限速
    location /downloads {
        limit_rate 1m;  # 限制每个连接1MB/s
        
        # 设置下载头
        add_header Content-Disposition "attachment";
        
        # 大文件支持断点续传
        add_header Accept-Ranges bytes;
    }
    
    # 防盗链
    location ~* \.(zip|rar|exe|dmg)$ {
        valid_referers none blocked server_names *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

目录浏览设置

server {
    listen 80;
    server_name files.example.com;
    root /var/www/files;
    
    location / {
        autoindex on;               # 启用目录浏览
        autoindex_exact_size off;   # 显示友好的文件大小
        autoindex_localtime on;     # 显示本地时间
        charset utf-8;              # 避免中文乱码
    }
    
    # 美化目录浏览页面
    location = /autoindex.css {
        root /etc/nginx/autoindex;
    }
    
    add_header Content-Type text/html;
}

5.2 反向代理配置

代理后端应用服务器

# 定义后端服务器组
upstream backend_app {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    # 权重负载均衡
    server 127.0.0.1:8082 weight=3;
    # 备用服务器
    server 127.0.0.1:8083 backup;
}

server {
    listen 80;
    server_name app.example.com;
    
    # 代理到后端应用
    location / {
        proxy_pass http://backend_app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 超时设置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
        
        # 缓冲设置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }
    
    # API接口代理
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 禁用缓存(动态内容)
        proxy_cache_bypass $http_pragma;
        proxy_cache_revalidate on;
    }
}

负载均衡配置

# 不同的负载均衡算法
upstream backend_round_robin {
    # 默认轮询
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

upstream backend_least_conn {
    # 最少连接数
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

upstream backend_ip_hash {
    # IP哈希(会话保持)
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

upstream backend_weighted {
    # 加权轮询
    server 192.168.1.10:8080 weight=5;
    server 192.168.1.11:8080 weight=3;
    server 192.168.1.12:8080 weight=2;
}

健康检查设置

upstream backend_with_health_check {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=2 fail_timeout=10s;
    
    # 定期检查(需要nginx_upstream_check_module模块)
    check interval=3000 rise=2 fall=3 timeout=1000 type=http;
    check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

server {
    listen 80;
    server_name app.example.com;
    
    location / {
        proxy_pass http://backend_with_health_check;
    }
    
    # 健康检查状态页面
    location /nginx_status {
        check_status;
        access_log off;
        allow 192.168.1.0/24;
        deny all;
    }
}

5.3 性能优化配置

缓存配置

# 定义缓存路径和配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name cached.example.com;
    
    location / {
        proxy_pass http://backend_app;
        
        # 启用缓存
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
        
        # 缓存键
        proxy_cache_key "$scheme$request_method$host$request_uri";
        
        # 添加缓存状态头
        add_header X-Cache-Status $upstream_cache_status;
        
        # 缓存锁定
        proxy_cache_lock on;
        proxy_cache_lock_timeout 5s;
        proxy_cache_lock_age 5s;
    }
    
    # 缓存清理接口
    location ~ /purge(/.*) {
        allow 127.0.0.1;
        deny all;
        proxy_cache_purge my_cache "$scheme$request_method$host$1";
    }
}

Gzip压缩

http {
    # Gzip配置
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied any;
    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;
        
    # Brotli压缩(需要模块支持)
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

连接数优化

# 工作进程配置
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
    accept_mutex off;
}

http {
    # 连接优化
    keepalive_timeout 65;
    keepalive_requests 100;
    client_max_body_size 100m;
    client_body_buffer_size 128k;
    
    # 发送优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    # 超时优化
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 15;
    
    # 缓冲区优化
    client_header_buffer_size 4k;
    large_client_header_buffers 8 4k;
    output_buffers 1 32k;
    postpone_output 1460;
}

六、安全加固与最佳实践

6.1 安全配置

隐藏版本信息

http {
    # 隐藏Nginx版本
    server_tokens off;
    
    # 自定义Server头(需要编译时添加more_headers模块)
    more_set_headers "Server: WebServer";
}

访问控制配置

server {
    listen 80;
    server_name secure.example.com;
    
    # IP白名单
    location /admin {
        allow 192.168.1.0/24;
        allow 10.0.0.0/8;
        deny all;
        
        # 基础认证
        auth_basic "Admin Area";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    
    # 限制请求方法
    location / {
        limit_except GET HEAD POST {
            deny all;
        }
    }
    
    # 防止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    
    # 防止访问备份文件
    location ~ ~$ {
        deny all;
        access_log off;
        log_not_found off;
    }
}

防DDoS基础设置

http {
    # 限制连接数
    limit_conn_zone $remote_addr zone=conn_limit_per_ip:10m;
    limit_conn_zone $server_name zone=conn_limit_per_server:10m;
    
    # 限制请求速率
    limit_req_zone $remote_addr zone=req_limit_per_ip:10m rate=5r/s;
}

server {
    listen 80;
    server_name protected.example.com;
    
    # 应用限制
    limit_conn conn_limit_per_ip 20;
    limit_conn conn_limit_per_server 1000;
    limit_req zone=req_limit_per_ip burst=10 nodelay;
    
    # 缓冲区限制
    client_body_buffer_size 1K;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
    
    # 超时限制
    client_body_timeout 10;
    client_header_timeout 10;
    keepalive_timeout 5 5;
    send_timeout 10;
    
    location / {
        # 特定路径的严格限制
        if ($request_method !~ ^(GET|HEAD|POST)$ ) {
            return 444;
        }
        
        # 拒绝空User-Agent
        if ($http_user_agent = "") {
            return 444;
        }
        
        root /var/www/html;
        index index.html;
    }
}

6.2 监控与维护

性能监控指标

server {
    listen 80;
    server_name monitor.example.com;
    
    # Nginx状态监控
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow 192.168.1.0/24;
        deny all;
    }
    
    # 详细状态信息(需要nginx-module-vts)
    location /status {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format html;
        allow 127.0.0.1;
        allow 192.168.1.0/24;
        deny all;
    }
}

常用监控工具

  1. 使用Prometheus + Grafana监控
# 安装nginx-prometheus-exporter
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.10.0/nginx-prometheus-exporter-0.10.0-linux-amd64.tar.gz
tar xzf nginx-prometheus-exporter-0.10.0-linux-amd64.tar.gz
sudo cp nginx-prometheus-exporter /usr/local/bin/

# 创建systemd服务
sudo tee /etc/systemd/system/nginx-exporter.service << 'EOF'
[Unit]
Description=Nginx Prometheus Exporter
After=network.target

[Service]
Type=simple
User=nginx
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri=http://localhost/nginx_status
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nginx-exporter
sudo systemctl start nginx-exporter
  1. 日志分析脚本
#!/bin/bash
# nginx-log-analyzer.sh

LOG_FILE="/var/log/nginx/access.log"
DATE=$(date +%Y-%m-%d)

echo "=== Nginx 访问统计 ($DATE) ==="
echo

# 访问量统计
echo "1. 总访问量:"
grep "$DATE" $LOG_FILE | wc -l

# IP访问排行
echo "2. IP访问排行 Top 10:"
grep "$DATE" $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

# 状态码统计
echo "3. HTTP状态码统计:"
grep "$DATE" $LOG_FILE | awk '{print $9}' | sort | uniq -c | sort -rn

# 最耗时请求
echo "4. 响应时间最长的请求 Top 10:"
grep "$DATE" $LOG_FILE | awk '{print $NF, $7}' | sort -rn | head -10

# 404错误统计
echo "5. 404错误页面 Top 10:"
grep "$DATE" $LOG_FILE | awk '($9 ~ /404/)' | awk '{print $7}' | sort | uniq -c | sort -rn | head -10

维护检查清单

#!/bin/bash
# nginx-health-check.sh

echo "=== Nginx健康检查报告 ==="
echo "检查时间: $(date)"
echo

# 1. 服务状态检查
echo "1. 服务状态:"
if systemctl is-active nginx &>/dev/null; then
    echo "   ✓ Nginx服务正在运行"
else
    echo "   ✗ Nginx服务未运行"
fi

# 2. 配置文件检查
echo "2. 配置文件语法:"
if nginx -t &>/dev/null; then
    echo "   ✓ 配置文件语法正确"
else
    echo "   ✗ 配置文件语法错误:"
    nginx -t
fi

# 3. 端口监听检查
echo "3. 端口监听状态:"
ss -tlnp | grep :80 &>/dev/null && echo "   ✓ 端口80正在监听" || echo "   ✗ 端口80未监听"
ss -tlnp | grep :443 &>/dev/null && echo "   ✓ 端口443正在监听" || echo "   ✗ 端口443未监听"

# 4. 磁盘空间检查
echo "4. 磁盘空间:"
df -h | grep -E "(/$|/var)" | awk '{if($5+0 > 80) print "   ✗ "$6" 使用率过高: "$5; else print "   ✓ "$6" 使用率正常: "$5}'

# 5. 日志文件大小检查
echo "5. 日志文件大小:"
find /var/log/nginx -name "*.log" -size +100M -exec ls -lh {} \; | awk '{print "   ⚠ 大日志文件: "$9" ("$5")"}'

# 6. SSL证书到期检查
echo "6. SSL证书检查:"
for cert in /etc/ssl/certs/*.crt; do
    if [ -f "$cert" ]; then
        exp_date=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)
        if [ -n "$exp_date" ]; then
            exp_timestamp=$(date -d "$exp_date" +%s)
            current_timestamp=$(date +%s)
            days_until_exp=$(( ($exp_timestamp - $current_timestamp) / 86400 ))
            
            if [ $days_until_exp -lt 30 ]; then
                echo "   ⚠ 证书即将过期: $(basename $cert) ($days_until_exp 天)"
            fi
        fi
    fi
done

echo
echo "检查完成"

七、故障排除与常见问题

7.1 安装过程常见问题

依赖包缺失解决

# Ubuntu/Debian常见依赖问题
sudo apt install build-essential libpcre3-dev libssl-dev zlib1g-dev

# CentOS/RHEL常见依赖问题
sudo yum install gcc gcc-c++ pcre-devel openssl-devel zlib-devel

# 编译时缺少模块依赖
# 安装图像处理模块依赖
sudo apt install libgd-dev        # Ubuntu
sudo yum install gd-devel         # CentOS

# 安装XML处理模块依赖  
sudo apt install libxml2-dev libxslt1-dev  # Ubuntu
sudo yum install libxml2-devel libxslt-devel  # CentOS

编译错误处理

# 常见编译错误1: 权限问题
sudo chown -R $USER:$USER /usr/local/src/nginx-*
cd /usr/local/src/nginx-*
make clean && ./configure [...] && make

# 常见编译错误2: 内存不足
# 增加swap空间
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 或者减少并发编译
make -j1

# 常见编译错误3: configure脚本找不到库
# 指定库路径
./configure --with-ld-opt="-L/usr/local/lib" --with-cc-opt="-I/usr/local/include"

权限问题解决

# 创建nginx用户
sudo useradd -r -s /sbin/nologin -M nginx

# 设置正确的文件权限
sudo chown -R nginx:nginx /var/log/nginx
sudo chown -R nginx:nginx /var/cache/nginx
sudo chmod 755 /etc/nginx
sudo chmod 644 /etc/nginx/nginx.conf

# 设置网站目录权限
sudo chown -R nginx:nginx /var/www
sudo chmod -R 755 /var/www

7.2 配置与运行问题

配置语法错误

# 检查配置语法
sudo nginx -t

# 常见语法错误示例及修复:

# 错误1: 缺少分号
# 错误配置
server_name example.com  # 缺少分号
# 正确配置
server_name example.com;

# 错误2: 大括号不匹配
# 检查每个开大括号是否有对应的闭大括号

# 错误3: 指令重复
# 某些指令在同一作用域内不能重复出现

# 错误4: 路径不存在
# 确保root、access_log等指令指向的路径存在
sudo mkdir -p /var/www/html
sudo mkdir -p /var/log/nginx

端口冲突解决

# 检查端口占用
sudo netstat -tlnp | grep :80
sudo ss -tlnp | grep :80

# 查找占用进程
sudo lsof -i :80

# 停止冲突服务(如Apache)
sudo systemctl stop apache2      # Ubuntu
sudo systemctl stop httpd        # CentOS

# 或者修改Nginx监听端口
server {
    listen 8080;  # 使用其他端口
    server_name example.com;
}

性能问题诊断

# 检查进程状态
ps aux | grep nginx

# 检查连接数
ss -s

# 检查文件描述符使用情况
cat /proc/sys/fs/file-nr
ulimit -n

# 增加文件描述符限制
echo "nginx soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "nginx hard nofile 65535" | sudo tee -a /etc/security/limits.conf

# 在nginx.conf中设置
worker_rlimit_nofile 65535;

# 检查内存使用
free -h
cat /proc/meminfo

# 检查磁盘I/O
iostat -x 1

7.3 日志分析与排错

错误日志分析

# 查看错误日志
sudo tail -f /var/log/nginx/error.log

# 常见错误类型及解决方法:

# 1. Permission denied
# [error] open() "/var/www/html/index.html" failed (13: Permission denied)
sudo chown -R nginx:nginx /var/www/html
sudo chmod -R 755 /var/www/html

# 2. No such file or directory  
# [error] open() "/var/www/html/favicon.ico" failed (2: No such file or directory)
touch /var/www/html/favicon.ico
# 或在配置中忽略404
location = /favicon.ico { 
    log_not_found off; 
    access_log off; 
}

# 3. Connection refused
# [error] connect() to 127.0.0.1:8080 failed (111: Connection refused)
# 检查后端服务是否正常运行
sudo systemctl status backend-service
netstat -tlnp | grep 8080

# 4. Too many open files
# [error] accept4() failed (24: Too many open files)
# 增加文件描述符限制(见上面性能问题诊断部分)

访问日志解读

# 标准访问日志格式
# $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

# 示例日志行
# 192.168.1.100 - - [01/Jan/2024:10:30:45 +0000] "GET /index.html HTTP/1.1" 200 1024 "https://google.com" "Mozilla/5.0..."

# 字段含义:
# 192.168.1.100    - 客户端IP
# -                - 远程用户(通常为空)
# -                - 认证用户(通常为空)  
# [01/Jan/2024:10:30:45 +0000] - 请求时间
# "GET /index.html HTTP/1.1"    - 请求方法、URI、协议版本
# 200              - HTTP状态码
# 1024             - 响应字节数
# "https://google.com" - 来源页面
# "Mozilla/5.0..." - 用户代理字符串

# 分析脚本示例
#!/bin/bash
# 分析访问日志的常用命令

LOG_FILE="/var/log/nginx/access.log"

# 统计状态码
echo "状态码统计:"
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -rn

# 统计访问最多的IP
echo "访问最多的IP Top 10:"
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | head -10

# 统计访问最多的页面
echo "访问最多的页面 Top 10:"
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -rn | head -10

# 统计404错误
echo "404错误统计:"
awk '($9 ~ /404/)' $LOG_FILE | awk '{print $7}' | sort | uniq -c | sort -rn

调试技巧分享

# 1. 启用调试日志
# 在nginx.conf中设置
error_log /var/log/nginx/debug.log debug;

# 2. 使用curl测试
# 测试基本连接
curl -I http://localhost

# 测试特定header
curl -H "Host: example.com" http://localhost

# 测试POST请求
curl -X POST -d "test=data" http://localhost/api

# 3. 使用tcpdump抓包
sudo tcpdump -i any port 80 -A

# 4. 检查SELinux(CentOS/RHEL)
# 查看SELinux状态
getenforce

# 查看SELinux日志
sudo ausearch -m avc -ts recent

# 临时禁用SELinux(不推荐生产环境)
sudo setenforce 0

# 5. 网络连接测试
# 测试端口连通性
telnet localhost 80

# 检查DNS解析
nslookup example.com
dig example.com

# 6. 进程调试
# 跟踪系统调用
sudo strace -p $(pgrep nginx | head -1)

# 查看进程打开的文件
sudo lsof -p $(pgrep nginx | head -1)

八、总结与进阶方向

8.1 核心要点回顾

通过本文的学习,我们掌握了Nginx在Linux环境下的完整部署流程:

安装要点总结:

  • 包管理器安装适合快速部署和测试环境
  • 源码编译安装提供更好的性能和灵活性,适合生产环境
  • Docker容器化安装便于现代化部署和管理

配置要点总结:

  • 理解配置文件的层次结构和语法规则
  • 掌握虚拟主机、SSL、代理等核心功能配置
  • 重视安全配置和性能优化设置

运维要点总结:

  • 建立完善的监控和日志管理机制
  • 制定规范的故障排除流程
  • 定期进行安全检查和性能优化

8.2 生产环境部署建议

架构设计建议:

# 生产环境推荐配置模板
user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
    accept_mutex off;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 日志格式
    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';
    
    # 基础优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    server_tokens off;
    
    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # 安全设置
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    
    # 限速设置
    limit_req_zone $remote_addr zone=login:10m rate=1r/s;
    limit_req_zone $remote_addr zone=api:10m rate=10r/s;
    
    # 包含站点配置
    include /etc/nginx/conf.d/*.conf;
}

部署检查清单:

  • 系统资源充足(CPU、内存、磁盘)
  • 防火墙和安全组规则正确配置
  • SSL证书有效且自动续期
  • 监控告警系统已部署
  • 备份和恢复方案已制定
  • 日志轮转和清理策略已配置
  • 性能基准测试已完成
  • 灾难恢复方案已验证

8.3 进一步学习方向

高级功能学习:

  1. Nginx Plus商业版功能

    • 高级负载均衡算法
    • 动态配置API
    • 活动健康检查
    • 实时监控面板
  2. 模块扩展开发

    • Lua脚本模块(OpenResty)
    • 自定义C模块开发
    • 第三方模块集成
  3. 性能调优深入

    • 内核参数优化
    • 网络栈调优
    • 缓存策略优化
    • CDN集成
  4. 安全加固进阶

    • WAF集成(ModSecurity)
    • DDoS防护策略
    • 零信任网络架构
    • 证书透明度(CT)

相关技术栈学习:

  1. 容器化和编排

    • Kubernetes中的Ingress Controller
    • Service Mesh(Istio/Linkerd)
    • Helm Charts部署
  2. 监控和可观测性

    • Prometheus + Grafana
    • ELK/EFK日志栈
    • Jaeger链路追踪
    • OpenTelemetry
  3. 自动化运维

    • Ansible自动化部署
    • Terraform基础设施即代码
    • GitOps工作流
    • CI/CD集成
  4. 云原生架构

    • 微服务网关
    • API管理平台
    • 服务发现机制
    • 配置管理系统

推荐学习资源:

  • 官方文档
  • Nginx开发者指南
  • 《Nginx高性能Web服务器详解》
  • 《实战Nginx》
  • NGINX University在线课程

通过系统学习Nginx的安装、配置和管理,相信您已经具备了在生产环境中部署和维护Nginx的能力。记住,运维工作需要持续学习和实践,建议在测试环境中多动手实验,逐步积累经验,最终成为一名优秀的Linux运维工程师。

Logo

一站式 AI 云服务平台

更多推荐