当前位置: 首页 > news >正文

Ubuntu 20.04 下 Nginx 安装配置与 systemd/ufw 深度解析

1. 项目概述:为什么在 Ubuntu 20.04 上装 Nginx 不是“点几下鼠标”的事,而是必须亲手过一遍的硬功夫

Nginx 是我过去十年里部署过最多次的服务——从给初创公司搭静态官网,到给金融客户做高并发 API 网关,再到给边缘设备做轻量反向代理。每次重装系统,我第一件事永远不是配 SSH 密钥,而是先跑通sudo apt install nginx这一行命令。但就在 Ubuntu 20.04 这个版本上,我连续踩了三次坑:第一次装完systemctl status nginx显示 active(running),浏览器却打不开 80 端口;第二次手动改了nginx.conf,结果sudo nginx -t报错说server_names_hash_bucket_size不够;第三次用ufw开放端口时,误把sudo ufw allow 'Nginx Full'写成sudo ufw allow 'Nginx HTTP',结果 HTTPS 流量全被拦死。这三件事加起来不到 20 分钟,但背后暴露的是 Ubuntu 20.04 对 Nginx 的默认策略、ufw 的服务组命名逻辑、systemctl 的单元文件加载机制、以及 nginx.conf 原始配置文件中那些藏得极深的注释行——它们不是“可有可无的说明”,而是决定你能不能在生产环境里多活五分钟的关键开关。

你搜“Nginx Ubuntu 20.04”时看到的教程,90% 都只告诉你“四步安装”,却没人告诉你第 5 步:检查/lib/systemd/system/nginx.serviceExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'这一行到底在验什么;也没人提醒你,/etc/nginx/sites-enabled/default文件顶部那句# You may add here your own files and then include them后面的include /etc/nginx/conf.d/*.conf;实际上会覆盖掉你自定义的upstream块;更没人讲清楚,为什么sudo systemctl edit nginx打开的编辑器默认是 nano 而不是 vim,而你一旦按 Ctrl+X 退出没保存,整个 override 目录就空着,systemctl reload 之后连日志都找不到源头。这些不是“高级技巧”,而是 Ubuntu 20.04 + Nginx 组合下最基础的生存常识。这篇文章不教你“怎么装”,而是带你亲手拆开每一个螺丝,看清垫片在哪、弹簧多硬、卡扣怎么弹——尤其当你明天就要上线一个前端项目、后天要配反向代理、大后天要加 SSL 证书时,这套肌肉记忆比任何“一键脚本”都管用。

2. 安装前的底层认知:Ubuntu 20.04 的包管理、服务模型与 Nginx 的“出厂设置”逻辑

2.1 为什么不用源码编译?APT 仓库里的 Nginx 到底是谁打包的?

很多人一上来就想./configure && make && sudo make install,觉得“自己编译才可控”。但在 Ubuntu 20.04 上,这是典型的用力过猛。官方仓库里的nginx包由 Ubuntu Server Team 维护,版本号是1.18.0-0ubuntu1.5(截至 2024 年中),它不是简单地把官网 tar.gz 解压进去,而是做了三件关键事:

  • 模块预编译整合--with-http_ssl_module--with-http_v2_module--with-http_realip_module全部内置,无需你手动加--add-module=;但--with-http_perl_module--with-mail被明确禁用,因为 Ubuntu 认为邮件代理和 Perl 脚本在现代 Web 架构中属于高危面。
  • 路径标准化硬编码:所有prefixsbin-pathconf-path都指向/usr/share/nginx/usr/sbin/nginx/etc/nginx,而不是源码默认的/usr/local/nginx。这意味着你nginx -c /tmp/my.conf可以跑,但systemctl start nginx永远只认/etc/nginx/nginx.conf—— 这不是 bug,是设计。
  • 安全沙箱加固nginx.service单元文件里强制启用了ProtectSystem=fullPrivateTmp=true,进程无法写入/etc/var/log以外的路径,连access_log /tmp/access.log都会被拒绝,除非你显式加ReadWritePaths=/tmp

提示:你可以用apt show nginx查看完整元数据,其中Built-Using:字段会列出所有构建依赖,比如openssl (1.1.1f-1ubuntu2.22)—— 这直接决定了你后续配 TLS 1.3 时能不能用ssl_protocols TLSv1.2 TLSv1.3;

2.2 systemctl 与 nginx 的“双向绑定”:启动、校验、重载的底层链条

systemctl不是简单的“开关按钮”,它是 Ubuntu 20.04 下服务生命周期的总控台。Nginx 的.service文件(路径/lib/systemd/system/nginx.service)里藏着三个关键钩子,它们共同构成了“装完就能用”的基础:

  • ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
    这是启动前的“安检门”。-t表示只做语法校验,-q是 quiet 模式(不输出成功信息),-g是全局指令,强制启用 daemon 和 master_process。注意:这里-g的值必须和nginx.confdaemon on;master_process on;完全一致,否则校验失败。我见过太多人把nginx.conf改成daemon off;(为了 Docker 调试),结果systemctl start nginx直接报nginx: [emerg] "daemon" directive is not allowed here—— 因为ExecStartPre里写的还是on

  • ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
    这是真正的启动命令。它和ExecStartPre-g参数必须一字不差。如果你在nginx.conf里写了user www-data;,那么nginx主进程会以www-data用户身份运行,但ExecStart本身仍由 root 执行(systemd 的特权机制)。

  • ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
    reload不是重启,而是发送SIGHUP信号给 master 进程,让其平滑加载新配置、优雅关闭旧 worker。关键点在于:reload前会自动触发一次nginx -t校验,失败则中断,不会影响正在运行的服务。这就是为什么sudo systemctl reload nginxsudo nginx -s reload更安全——前者有双重保险。

注意:chkconfig是 CentOS 6 时代的遗物,Ubuntu 20.04 全面使用 systemd,sudo systemctl list-unit-files | grep nginx才是你该查的服务状态清单。

2.3 ufw 的“服务组”本质:'Nginx Full'不是魔法,而是/etc/ufw/applications.d/下的配置文件

sudo ufw allow 'Nginx Full'这条命令之所以能生效,是因为 Ubuntu 在/etc/ufw/applications.d/目录下预置了一个nginx文件,内容如下:

[nginx] title=Web Server (Nginx, HTTP) description=Small, but very powerful and efficient web server ports=80/tcp [nginx secure] title=Web Server (Nginx, HTTPS) description=Small, but very powerful and efficient web server ports=443/tcp [nginx full] title=Web Server (Nginx, HTTP + HTTPS) description=Small, but very powerful and efficient web server ports=80,443/tcp

看到没?'Nginx Full'就是[nginx full]这个 section 的别名,它展开后就是80,443/tcp。如果你执行sudo ufw allow 'Nginx HTTP',实际打开的是[nginx],只有 80 端口;而'Nginx HTTPS'对应[nginx secure],只有 443。很多新手以为ufw是智能识别 Nginx 的,其实它只是字符串匹配 ini 文件里的title=字段。

实操心得:你可以用sudo ufw app list查看所有预置服务,用sudo ufw app info 'Nginx Full'查看具体端口。如果未来你要开 WebSocket(8080)或健康检查端口(8001),别硬记数字,直接sudo ufw allow 8080/tcp更直白。

2.4 nginx.conf 原始配置文件的“洋葱结构”:从全局块到 server 块的嵌套逻辑

Ubuntu 20.04 的/etc/nginx/nginx.conf不是单层平面文档,而是一个四层洋葱:

  • 第 0 层:全局块(main context)
    位于文件最外层,控制整个 Nginx 进程行为:userworker_processeserror_logpidevents块。这里worker_processes auto;是重点——它不是固定数值,而是根据 CPU 核心数自动计算。nproc命令返回 4,auto就等于 4;如果是容器环境,nproc可能返回 128,但实际可用核数只有 2,这时你需要手动设为worker_processes 2;,否则会因争抢 CPU 反而降低吞吐。

  • 第 1 层:http 块(http context)
    所有 HTTP 相关配置的容器,包括include /etc/nginx/mime.types;default_type application/octet-stream;log_formataccess_logsendfile on;等。最关键的是include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;这两行——它们不是可有可无的 include,而是 Nginx 加载用户配置的“唯一入口”。conf.d/用于通用模块(如 gzip、limit_req),sites-enabled/用于站点虚拟主机(virtual host)。顺序很重要:conf.d/先加载,sites-enabled/后加载,所以你在conf.d/gzip.conf里设的gzip on;会被sites-enabled/default里的gzip off;覆盖。

  • 第 2 层:server 块(server context)
    位于http块内,定义一个虚拟主机。listen 80 default_server;中的default_server是关键:当请求 Host 头不匹配任何server_name时,Nginx 会把流量路由到这个default_server。Ubuntu 默认的/etc/nginx/sites-enabled/default就是它,所以你访问服务器 IP 地址时看到的欢迎页,就是这个server块渲染的。

  • 第 3 层:location 块(location context)
    位于server块内,处理 URL 路径匹配。location / { ... }是根路径,location ~ \.php$ { ... }是正则匹配 PHP 文件。注意:location有严格优先级,=精确匹配 >^~前缀匹配 >~正则匹配 > 普通前缀匹配。location /api/location /api/v1/同时存在时,/api/v1/test会命中后者,因为它是更长的前缀。

提示:nginx -T(大写 T)可以打印出所有最终生效的配置(含 include 后的合并结果),比nginx -t多一步“展开”,是调试配置冲突的终极武器。

3. 完整实操流程:从裸机到可访问的 Nginx 服务,每一步都附带原理验证

3.1 环境初始化:确认系统状态与网络基础

在敲任何apt命令前,先做三件事:

  1. 确认系统版本与内核

    lsb_release -a # 输出应为: Ubuntu 20.04.6 LTS uname -r # 输出应为: 5.4.0-xx-generic(20.04 默认内核)

    如果lsb_release报错,说明lsb-release包未安装,sudo apt install lsb-release补上。这不是废话——有些云厂商镜像会精简掉这个包,导致后续apt updatesources.list生成失败。

  2. 更新软件源并修复潜在损坏

    sudo apt update && sudo apt upgrade -y sudo apt --fix-broken install -y

    apt upgrade不仅升级软件,还会触发dpkg的 postinst 脚本,这些脚本可能重建/etc/nginx目录权限或重置www-data用户组。跳过这步,后面nginx -t可能因nginx.conf权限为 600(只读 root)而失败。

  3. 检查防火墙初始状态

    sudo ufw status verbose # 如果显示 inactive,说明 ufw 未启用,Nginx 启动后 80 端口天然开放 # 如果显示 active,且规则里有 deny any,必须先允许端口再启动 Nginx

实操心得:我习惯在apt update后立刻执行sudo apt install net-tools -y,然后用netstat -tuln | grep :80确认 80 端口是否被 Apache 或其他服务占用。Ubuntu 20.04 默认不装 Apache,但某些预装镜像会自带,ps aux | grep apache2是第二道保险。

3.2 Nginx 安装与基础服务验证:不止是apt install

执行标准安装:

sudo apt install nginx -y

安装完成后,立刻验证四个维度:

  • 维度 1:二进制文件与版本

    nginx -v # 输出: nginx version: nginx/1.18.0 (Ubuntu) nginx -V 2>&1 | grep -i "configure arguments" # 输出: configure arguments: --prefix=/usr/share/nginx ...

    nginx -V(大写 V)显示完整编译参数,确认--with-http_ssl_module是否在列。如果不在,说明你装的是nginx-lightnginx-core,需卸载重装nginx-full

  • 维度 2:服务单元状态

    sudo systemctl status nginx # 必须看到 Active: active (running) 且 Main PID 后面跟着进程号 # 如果是 failed,用 sudo journalctl -u nginx --since "1 hour ago" 查日志
  • 维度 3:端口监听状态

    sudo ss -tuln | grep :80 # 应输出: tcp LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234,fd=6),("nginx",pid=1235,fd=6)) # 注意:`ss` 比 `netstat` 更快更准,且 Ubuntu 20.04 默认不装 netstat
  • 维度 4:本地 curl 测试

    curl -I http://localhost # 应返回 HTTP/1.1 200 OK 和 Server: nginx/1.18.0 # 如果返回 Connection refused,说明 nginx 没监听,或 ufw 拦截

注意:curl -I(大写 i)只获取响应头,不下载正文,速度快且能验证 HTTP 状态码。这是运维人员每天必敲的“心跳检测”。

3.3 ufw 防火墙配置:精确到端口协议,拒绝模糊操作

假设你的服务器需要对外提供 HTTP 和 HTTPS 服务,执行:

sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable

验证:

sudo ufw status numbered # 输出应类似: # 1) OpenSSH ALLOW IN Anywhere # 2) Nginx Full ALLOW IN Anywhere # 3) OpenSSH (v6) ALLOW IN Anywhere (v6) # 4) Nginx Full (v6) ALLOW IN Anywhere (v6)

这里Nginx Full自动包含了 IPv4 和 IPv6 规则。如果你只想开 IPv4,用sudo ufw allow proto tcp from any to any port 80,443更精准。

实操心得:我从不信任ufw status的文字描述。真正验证是否生效,是用另一台机器telnet your-server-ip 80。如果连接成功,说明端口通;如果Connection refused,说明 Nginx 没起;如果Connection timed out,说明 ufw 拦截了。这是网络排障的黄金三角判断法。

3.4 nginx.conf 原始配置深度解析与最小化修改

打开/etc/nginx/nginx.conf,逐段解读:

user www-data; # Ubuntu 默认用户,Nginx worker 进程以该用户身份运行,确保不能读写 /root/ worker_processes auto; # 自动适配 CPU 核心数,生产环境建议设为物理核心数,避免上下文切换开销 pid /run/nginx.pid; # pid 文件位置,systemctl 通过此文件管理进程,不要乱改 events { worker_connections 768; # 每个 worker 进程最大连接数,768 是 Ubuntu 默认值 # 计算公式:max_clients = worker_processes * worker_connections # 所以默认最大支持 768*auto 个并发连接 }

http块开头:

http { sendfile on; # 启用零拷贝,直接从磁盘 DMA 到网卡,大幅提升静态文件传输效率 tcp_nopush on; # 与 sendfile 配合,等待 TCP 缓冲区满再发,减少小包 tcp_nodelay on; # 关闭 Nagle 算法,对实时性要求高的应用(如 WebSocket)必须开 keepalive_timeout 65; # 客户端连接保持 65 秒,超时断开,释放 worker 连接 types_hash_max_size 2048; # MIME 类型哈希表大小,如果添加大量自定义类型,需调大

最关键的include行:

include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式定义,注意 $request_time 是关键性能指标 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'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; # Gzip 压缩,但默认是注释掉的,需手动开启 # gzip on; # gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }

最小化修改建议(仅改三处):

  1. 开启 gzip:取消gzip on;gzip_disable行的注释,提升文本类资源(HTML/CSS/JS)传输速度。
  2. 调整 keepalive_timeout:改为keepalive_timeout 30;,30 秒足够大多数浏览器复用连接,比 65 秒更节省资源。
  3. 强化日志格式:在log_format main末尾加上$request_length,记录请求体大小,便于排查大文件上传问题。

修改后执行sudo nginx -t校验,成功则sudo systemctl reload nginx生效。

提示:$request_time是从接受第一个字节到发送最后一个字节的总耗时(毫秒),$upstream_response_time是 Nginx 转发请求到上游(如 FastAPI)并收到响应的时间。两者差值就是 Nginx 自身处理时间,超过 10ms 就要查配置瓶颈。

3.5 站点配置实战:从 default 到自定义项目的平滑迁移

Ubuntu 默认的/etc/nginx/sites-enabled/default是学习模板,但生产环境必须替换。以部署一个前端 Vue 项目为例(构建后输出在/var/www/myapp):

  1. 创建站点目录与权限

    sudo mkdir -p /var/www/myapp sudo chown -R $USER:www-data /var/www/myapp sudo chmod -R 755 /var/www/myapp # $USER 是你的登录用户,www-data 是 Nginx 用户组,确保 Nginx 能读取
  2. 编写自定义 server 块
    创建/etc/nginx/sites-available/myapp

    server { listen 80; server_name myapp.example.com; # 替换为你的域名,或留空用 IP 访问 root /var/www/myapp; index index.html; # 关键:Vue Router history 模式需要重写 location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } # API 反向代理(假设后端在 localhost:3000) 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; } }
  3. 启用站点并测试

    sudo ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp sudo nginx -t # 必须通过! sudo systemctl reload nginx
  4. 验证访问
    用浏览器访问http://your-server-ip,应看到index.html;访问http://your-server-ip/api/test,应被代理到localhost:3000/test

实操心得:try_files是前端单页应用(SPA)的灵魂。$uri匹配真实文件,$uri/匹配目录,/index.html是兜底。没有它,Vue Router 的/user/123路径刷新就会 404。我曾因漏掉这一行,在客户现场调试两小时。

4. 高频问题与硬核排查:从nginx: [emerg]502 Bad Gateway的全链路诊断

4.1nginx: [emerg]类错误:配置语法与路径权限的生死线

错误现象sudo nginx -t报错,如nginx: [emerg] open() "/etc/nginx/sites-enabled/default" failed (13: Permission denied)

根因分析/etc/nginx/sites-enabled/default文件权限不是 644,或其父目录/etc/nginx/sites-enabled/权限不是 755。Nginx 主进程以 root 启动,但校验时会尝试以www-data用户身份读取sites-enabled/下的文件(因为include是在http块里,属于工作上下文)。

解决步骤

# 检查文件权限 ls -l /etc/nginx/sites-enabled/default # 正常应为: -rw-r--r-- 1 root root ... # 检查目录权限 ls -ld /etc/nginx/sites-enabled/ # 正常应为: drwxr-xr-x 2 root root ... # 修复(如果权限异常) sudo chmod 644 /etc/nginx/sites-enabled/default sudo chmod 755 /etc/nginx/sites-enabled/ sudo nginx -t

错误现象nginx: [emerg] unknown directive "location"

根因分析location块写在了http块之外,比如直接放在nginx.conf文件末尾,或者server块没闭合(缺少}),导致 Nginx 解析器认为location是顶级指令。

解决步骤

  • vim /etc/nginx/nginx.conf,按gg=G自动缩进,观察location是否缩进到server {内部;
  • grep -n "}" /etc/nginx/sites-enabled/myapp | tail -5查看最后几个}的行号,确认server块是否闭合;
  • nginx -T | tail -20查看最终合并后的配置,定位location出现在哪一层。

注意:nginx -T会输出所有配置(含注释),行数可能上千,用| less分页查看更高效。

4.2502 Bad Gateway:反向代理失效的七种可能

这是 Nginx 最经典的错误,意味着 Nginx 作为代理,无法从上游(upstream)拿到有效响应。原因远不止“后端没起”那么简单。

可能原因验证命令解决方案
上游服务未监听sudo ss -tuln | grep :3000启动后端服务,确认127.0.0.1:3000在 LISTEN 状态
上游监听地址错误curl -v http://127.0.0.1:3000/health后端必须监听127.0.0.10.0.0.0,不能只监听localhost(IPv6)
Nginx 无法解析 upstream 域名sudo nginx -tresolving错误upstream块中用 IP 代替域名,或在/etc/nginx/nginx.confhttp块里加resolver 8.8.8.8;
SELinux/AppArmor 限制sudo aa-status | grep nginxUbuntu 20.04 默认用 AppArmor,sudo aa-disable /usr/sbin/nginx临时关闭测试
proxy_pass URL 末尾斜杠不一致curl -v http://127.0.0.1:3000/api/v1/testproxy_pass http://127.0.0.1:3000/;(有斜杠)会重写路径,proxy_pass http://127.0.0.1:3000;(无斜杠)会原样转发
上游响应超时tail -f /var/log/nginx/error.log | grep "upstream timed out"location块中加proxy_read_timeout 300;(单位秒)
上游返回非 HTTP 响应tcpdump -i lo -A port 3000 | grep "HTTP/1.1"curl -v http://127.0.0.1:3000/确认返回的是标准 HTTP 响应头

实操心得:我排查502的第一反应永远是tail -f /var/log/nginx/error.log,然后在另一个终端curl -v http://127.0.0.1:3000/。如果curl成功但 Nginx 报502,一定是proxy_pass配置或网络策略问题;如果curl也失败,那就是后端自身问题。

4.3systemctl edit nginx的正确姿势:override 机制与编辑器陷阱

sudo systemctl edit nginx的目的是创建/etc/systemd/system/nginx.service.d/override.conf,用于覆盖默认单元文件中的参数(如修改ExecStart路径)。但新手常犯两个致命错误:

  • 错误 1:编辑器选择混乱
    Ubuntu 20.04 默认编辑器是nano,但很多人习惯vimsudo systemctl edit nginx会调用EDITOR环境变量,如果未设置,则 fallback 到nano。如果你export EDITOR=vim后再执行,会进入 vim;但如果中途 Ctrl+C 退出,override.conf文件可能为空,systemctl daemon-reload后反而破坏服务。

  • 错误 2:override 语法错误
    override.conf不是 Nginx 配置,而是 systemd 单元片段,必须用[Service]段落包裹:

    [Service] ExecStart= ExecStart=/usr/sbin/nginx -g 'daemon off; master_process on;'

    注意:ExecStart=是清空原有值,第二行才是新值。漏掉第一行,systemd 会把新旧ExecStart都执行,导致冲突。

安全操作流程

# 1. 先确认当前 ExecStart sudo systemctl cat nginx \| grep ExecStart # 2. 创建 override(用 nano 确保安全) sudo systemctl edit nginx # 在 nano 中输入: # [Service] # ExecStart= # ExecStart=/usr/sbin/nginx -g 'daemon off; master_process on;' # 3. 保存退出(Ctrl+O → Enter → Ctrl+X) # 4. 重载 systemd 配置 sudo systemctl daemon-reload # 5. 验证 override 是否生效 sudo systemctl cat nginx \| grep -A 2 ExecStart

提示:sudo systemctl cat nginx会显示原始单元文件 + 所有 override 片段,是验证的黄金命令。

4.4 日志分析实战:从 access.log 看流量,从 error.log 找真相

Nginx 日志是唯一的真相来源。Ubuntu 20.04 默认日志路径:

  • /var/log/nginx/access.log:记录每一次 HTTP 请求
  • /var/log/nginx/error.log:记录 Nginx 自身错误(配置错误、权限问题、上游失败)

access.log 关键字段速查表

字段含义实用场景
$remote_addr客户端真实 IP配合X-Forwarded-For识别 CDN 后的真实用户
$request完整请求行(如GET /api/users HTTP/1.1快速定位高频接口或恶意扫描路径
$statusHTTP 状态码grep " 50"查 5xx 错误,grep " 40"查 4xx 错误
$body_bytes_sent响应体字节数awk '$10 > 10000000 {print}' access.log查超大响应(可能泄露敏感数据)
$request_time总耗时(秒)awk '$11 > 5 {print}' access.log查慢请求(>5s)
$upstream_response_time上游响应耗时$request_time - $upstream_response_time > 1表示 Nginx 自身处理慢

error.log 高频错误解码

  • connect() failed (111: Connection refused) while connecting to upstream
    上游服务彻底宕机或端口未监听。

  • upstream timed out (110: Connection timed out) while reading response header from upstream
    上游处理时间超过proxy_read_timeout,需调大该值或优化后端。

  • client intended to send too large body
    客户端上传文件超过client_max_body_size(默认 1M),需在httpserver块中加client_max_body_size 100M;

  • no live upstreams while connecting to upstream
    upstream块中所有服务器都标记为down,可能是健康检查失败或max_fails触发。

实操心得:我每天早上第一件事是sudo awk '$9 ~ /^5/ {count++} END {print "5xx errors:", count+0}' /var/log/nginx/access.log,统计昨日 5xx 总数。超过 10 次就立刻tail -50 /var/log/nginx/error.log排查。

5. 进阶能力延伸:从基础安装到生产就绪的五项关键加固

5.1 配置文件版本化:用 git 管理/etc/nginx,告别“改完就忘”

/etc/nginx目录必须纳入版本控制。这不是开发习惯,而是运维底线。

# 初始化 git 仓库 cd /etc/nginx sudo git init sudo git config --global user.name "nginx-admin" sudo git config --global user.email "admin@localhost" # 添加忽略文件(避免跟踪日志和临时文件) echo -e "/logs/\n/error.log\n/access.log\n/nginx.pid\n/sites-enabled/*\n!sites-enabled/default" | sudo tee .gitignore # 提交初始配置 sudo git add . sudo git commit -m "Initial nginx config for Ubuntu 20.04"

后续每次修改配置,流程变为:

sudo nginx -t &&
http://www.jsqmd.com/news/1056293/

相关文章:

  • 如何快速掌握浏览器SVG编辑:专业矢量图形创作终极指南
  • 滁州全屋定制选购指南|百川一沐全屋定制实测盘点+行业避坑干货 - 百航
  • MC9S08AW60实现IEC 60730 Class B通信监控与诊断实战指南
  • 2026年实测:酒店摄像头检测仪和App探测器哪个更准?3分钟出结果 - GrowthUME
  • BTS6303U预驱动放大器在5G mMIMO基站中的设计与实战指南
  • 7倍效率提升!炉石传说智能脚本完整指南:告别手动操作,轻松完成日常任务
  • 广州2026年度GEO服务商Top5:助力企业快速上手的实操攻略与落地执行方案 - GEO优化
  • 从PowerQUICC II到III迁移实战:架构差异、MMU配置与调试技巧
  • 房屋拆分问题 -
  • 83个Tracker服务器清单:彻底解决BT下载卡顿的终极方案
  • Keep开源AIOps平台:如何构建智能化的运维数字哨兵系统
  • IAR LPC2478开发套件实战:从零构建ARM7嵌入式系统
  • 2026年西安GEO服务商:针对选型指南与常见疑问的专业解答与建议 - GEO优化
  • 寄快递怎么便宜又省钱?5折渠道+比价技巧全攻略 - 生活情报姬
  • 怎样高效管理IDM试用期:3个实用技巧深度解析
  • Ollama本地部署+API调用+LLM封装:轻量可靠的大模型落地三件套
  • QueryExcel:终极Excel批量查询自动化工具完整指南
  • 用数据说话!2026年最值得用的专业AI论文平台
  • 基于PC Master与Excel的嵌入式调试界面开发实战
  • 3个实用技巧让FanControl成为你的Windows散热管理神器
  • 2026北京黄金回收全攻略|鑫奢16区直营门店全覆盖 大盘价减2元零隐形扣费 - 鑫奢黄金回收
  • Qwen 3.5 35B A3B本地部署实战:LoongArch适配与llama.cpp优化
  • 微信聊天记录永久保存终极指南:免费导出工具WeChatExporter详解
  • 飞思卡尔8位MCU选型指南:HC08、S08与RS08核心架构深度解析与实战应用
  • DPDK高性能交换机深度实践:一次Burst失配引发的转发性能雪崩
  • Kali Linux部署FSCAN内网扫描实战:从环境配置到漏洞探测
  • 2026深圳热门腕表回收指南:认准实体店,拒绝拆机压价套路 - 讯息早知道
  • 基于MC9S08MP16的汽车HBLED恒流驱动:Buck-Boost拓扑与PID控制实战
  • 2026宣城高三失利择校指南,公办校内复读,区别校外民办复读机构 - cc江江
  • 2026年实用降AIGC平台:实测AI率从90%降至4%的稳妥方案