Ubuntu 运维系列 | 第 19 天:Web 服务器运维——Nginx 配置、反向代理与性能调优

在运维工程师的日常工作中,Web 服务器是出现频率最高的基础设施之一。无论是承载静态站点、为后端应用做反向代理,还是承担负载均衡与 HTTPS 终结,Nginx 都凭借其高性能、低内存占用和丰富的模块化能力,成为 Linux 服务器上的首选方案。本文以 Ubuntu 22.04/24.04 为环境,从安装、配置、反向代理到性能调优,系统梳理 Web 服务器运维的核心要点。

Ubuntu 运维 第19天

核心概念

Nginx 采用「主进程 + 多工作进程」的事件驱动架构。master 进程负责读取配置、绑定端口和管理 worker,worker 进程则通过 epoll 等异步非阻塞机制处理大量并发连接。与传统 Apache prefork 模式相比,Nginx 在处理高并发静态资源时内存开销更小、吞吐量更高。

一个典型的 Nginx 配置由多个 server 块组成,每个 server 对应一个虚拟主机,内部通过 location 块匹配不同的 URI,实现静态文件服务、反向代理或重定向。配置遵循「继承 + 覆盖」的规则,全局指令位于 http 块,站点级指令位于 server 块。

实战步骤

1. 安装与基础命令

在 Ubuntu 上通过 APT 安装官方或系统源中的 Nginx:

sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
nginx -v          # 查看版本
sudo systemctl status nginx

安装完成后,默认站点根目录为 /var/www/html,主配置文件位于 /etc/nginx/nginx.conf,站点配置通常放在 /etc/nginx/sites-available/ 并通过软链接启用。

2. 配置虚拟主机

创建站点配置 /etc/nginx/sites-available/example.com

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

启用站点并重载配置:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t              # 校验配置语法
sudo systemctl reload nginx

3. 反向代理与负载均衡

将请求代理到本机 3000 端口的 Node.js 应用,并配置超时与请求头:

upstream app_backend {
    server 127.0.0.1:3000 weight=3;
    server 127.0.0.1:3001 weight=1;
    keepalive 32;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        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 5s;
        proxy_read_timeout 60s;
    }
}

upstream 块中的 weight 用于加权轮询,实现简单的负载均衡。keepalive 保持与后端的连接复用,减少握手开销。

4. 启用 HTTPS

使用 Let’s Encrypt 的 certbot 自动签发并续期证书:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
sudo systemctl status certbot.timer   # 确认自动续期定时器

5. 性能调优

根据服务器 CPU 核数与内存调整 worker 相关参数:

worker_processes auto;          # 自动匹配 CPU 核数
worker_connections 4096;        # 每个 worker 的最大连接数
events {
    worker_connections 4096;
    use epoll;
}

http {
    sendfile on;                # 零拷贝发送文件
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    gzip on;                    # 开启 gzip 压缩
    gzip_types text/plain text/css application/json application/javascript;
    open_file_cache max=10000 inactive=30s;
}

此外,可限制请求速率防止滥用,并为响应添加缓存头:

limit_req_zone $binary_remote_addr zone=api:10m rate=20r/s;

server {
    location /api/ {
        limit_req zone=api burst=40 nodelay;
        proxy_pass http://app_backend;
    }
}

常见问题

1. 修改配置后不生效?
务必先执行 sudo nginx -t 校验语法,再执行 sudo systemctl reload nginx(热重载)而非 restart。reload 会平滑加载新配置,避免短暂中断服务。

2. 502 Bad Gateway?
通常是后端应用未启动、端口错误或超时配置过短。检查 journalctl -u nginx 与后端日志,确认 proxy_pass 地址与后端监听端口一致,并适当增大 proxy_read_timeout

3. 权限导致 403?
确认站点根目录对 Nginx 运行用户(通常为 www-data)具备读权限,父目录具备执行权限,并检查是否有 SELinux/AppArmor 限制。

4. 如何查看当前生效的配置?
使用 nginx -T 可输出完整的合并后配置,便于排查继承与覆盖带来的困惑。

总结

本文从 Nginx 的架构原理出发,覆盖了安装、虚拟主机、反向代理、HTTPS 与性能调优等 Web 服务器运维的核心场景。掌握这些基础后,运维人员能够独立搭建稳定、安全的 Web 服务。调优并非一蹴而就,需要结合压测工具(如 ab、wrk)观察并发表现,逐步迭代参数。


下期预告:第 20 天将进入容器化时代,讲解 Docker 容器运维——安装、镜像与容器生命周期管理,敬请期待。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容