1. 先给结论:Ubuntu 上最省事的 Nginx 安装路径
在搜索引擎里找“Ubuntu 安装 Nginx”,你会看到劝你编译源码的、让你加第三方 PPA 的、还有直接拉 Docker 镜像的。我的态度很明确:绝大多数情况下,最简便且最稳的方案只有一个——直接用 apt 装系统仓库里的 nginx。不是源码编译不好,而是在 Ubuntu 上,apt 装出来的版本经过了发行版团队打包和适配,配置文件的位置、systemd 服务的启动脚本、日志轮转都已经替你处理好了,出错概率最低。
这篇内容主要适合两类人:一是刚接触 Linux 的运维新手,想知道装完 Nginx 之后到底还要做哪些事;二是在 Ubuntu 24.04 LTS 环境下快速搭建 Web 服务的开发者,需要一套干净、可复现的步骤。我会把从环境检查、安装启动、静态站点、反向代理到多端口多域名配置全部串起来,顺带把常见问题排查方法也整理了。
1.1 为什么 apt 版本是默认答案
Linux 上的软件安装方式很多,但对 Nginx 来说,apt 装的是 Ubuntu 官方源里的二进制包。它有几个非常实际的好处。
第一,依赖不用管。Nginx 运行依赖的 libpcre3、zlib1g、openssl 等库,apt 会一并处理好。你不需要自己去解决“编译时报找不到 PCRE”这类问题。第二,服务集成度很高。apt 安装完成后,系统会自动创建 nginx 用户、生成 /etc/nginx 目录、注册 systemd 服务单元,甚至连 logrotate 日志轮转都配置好了,开机自启只需要 systemctl enable。第三,安全更新可以直接跟随系统源。每次 apt update && apt upgrade 就能把 Nginx 的补丁一起打上,这对生产环境很重要。
很多人觉得“自己编译的才是最新的”,但其实 Ubuntu LTS 仓库里的 Nginx 版本虽然不算激进,却足够稳定。如果你不是非要使用某个月新发布的特性、不是要在 Nginx 里编译第三方 C 模块,完全没必要为了版本号去折腾源码。像 Nginx 这种基础组件,稳定性比新鲜度值钱得多。
1.2 什么情况下才需要放弃 apt 走其他方案
先说源码编译。只有当你需要编译自定义模块、或者必须使用某一指定版本且仓库不提供时,才值得做。源码编译意味着你要自己处理依赖、自己写 systemd service、自己维护升级,光是前期的 configure 参数就够查半天。这在“最简便方法”这个话题下属于备用方案,不是首选。
另一个常见选择是 Docker。如果你已经有容器化体系,跑一个 nginx 容器确实很干净,一条 docker run 就能出服务。但容器方案要求你有 Docker 环境、要理解端口映射和卷挂载,对于本机快速搭建一个站点来说,反而多了一层概念负担。虚拟机里的 Ubuntu 开发环境通常也更适合直接用 systemd 服务,而不是非要套一层容器。所以我的判断很直接:没有特别需求就别绕路。
2. 安装前的环境准备:先花两分钟做检查
很多人装 Nginx 失败,不是安装命令的问题,而是系统环境没准备好。我习惯在敲安装命令之前先检查三样东西:系统版本、CPU 架构、软件源是否可用。这三项都正常,后面的安装就是一条命令的事。
2.1 确认 Ubuntu 版本和架构
先看系统版本。打开终端,执行:
lsb_release -a如果lsb_release没安装,可以看这个文件:
cat /etc/os-release看到Ubuntu 22.04.3 LTS或Ubuntu 24.04 LTS这样的字样就说明是你的系统信息。Ubuntu 20.04 和 24.04 的 Nginx 配置路径基本一致,所以下面这些步骤在两个版本上都能用。
接着看架构,现代机器基本都是 x86_64 或 arm64:
uname -m输出x86_64表示是 64 位 Intel/AMD 架构,输出aarch64表示是 64 位 ARM 架构。这个信息主要用来判断后面如果下载扩展模块,应该选哪个版本的包。对标准安装来说,apt 会自动匹配,所以这里只是确认环境没有太大意外。
2.2 更新索引和基础工具
安装之前先刷新软件源。这一步很多人会跳过,结果装到的索引是旧的,可能解析不到包。执行:
sudo apt update它会把软件源里的包列表拉到本地。如果是刚装好的 Ubuntu 系统,还是建议顺手把基础工具装上,后面下载文件、排查网络都方便:
sudo apt install -y curl wget ca-certificates这几个包体积不大,但对后续操作很友好。比如curl可以用来测试本地 Nginx 是否正常响应,wget可以在服务器上下载静态资源。ca-certificates 是 CA 证书库,后面配置 HTTPS 反向代理时系统不会因为证书链不完整而报错。做完这些检查,就可以正式安装了。
3. 最简便的安装实操:从 apt install 到浏览器看到欢迎页
现在进入正题。我可以负责任地说,只要环境正常,整个安装过程不会超过五分钟。关键是把安装、启动、验证这三步做完整,不要装完就跑。
3.1 执行安装命令并验证版本
在终端执行:
sudo apt install -y nginx-y参数表示自动确认,不需要再手动输入 Y。apt 会把 Nginx 及其依赖包下载并安装,安装结束时一般会自动注册 systemd 服务。你可以用下面这行命令确认版本:
nginx -v输出类似nginx version: nginx/1.24.0 (Ubuntu)就说明安装成功。注意,有些教程会让你用/usr/sbin/nginx -v,那是因为当前用户的 PATH 里没有 nginx 命令。如果你直接敲nginx -v提示找不到命令,就改敲完整路径,或者先把/usr/sbin加进 PATH。
安装完成后,Nginx 通常会启动,但为了保险,还是要手动确认一下服务状态。
3.2 启动服务、设置开机自启和放行防火墙
执行下面的命令,让 Nginx 立即启动并加入开机自启:
sudo systemctl enable --now nginxenable负责开机自启,--now表示立即启动。接着看服务状态:
sudo systemctl status nginx --no-pager如果看到active (running),说明 Nginx 已经跑起来了。如果你的 Ubuntu 开了 ufw 防火墙,还要放行 HTTP 和 HTTPS 端口,否则外部浏览器打不开:
sudo ufw allow 'Nginx Full'Nginx Full是 ufw 里预置的规则,同时放行 80 和 443 端口。做完这一步,在浏览器地址栏输入服务器的 IP 地址,比如http://192.168.1.10,就应该能看到 Nginx 的默认欢迎页。看到那个大大的 “Welcome to nginx!” 页面,说明安装完全正常。
3.3 认识 Nginx 默认目录结构
Nginx 装好后,目录布局有固定的一套。我建议你装完先花两分钟转一圈,后面配置时会省很多时间。
ls -l /etc/nginx/重点关注几个文件和目录:
/etc/nginx/nginx.conf是主配置文件,全局配置都写在这里。/etc/nginx/sites-available/存放站点配置,相当于“草稿区”。/etc/nginx/sites-enabled/存放启用的站点配置,通常是指向 sites-available 的软链接。/var/www/html/是默认站点的网页根目录。/var/log/nginx/里放着 access.log 和 error.log 两个日志文件。
这个结构是 Ubuntu/Debian 系特有的。它鼓励我们遵循“一个站点一个配置、放在 sites-available 里、再软链接到 sites-enabled 启用”的方式。不要一上来就全塞进 nginx.conf,那样维护起来会非常痛苦。
4. 装完之后必做的 4 类配置
到这一步,Nginx 只是“能跑”。真正让 Nginx 干活,还需要做配置。下面这几类配置是我日常用得最多的:静态站点、反向代理、多端口多域名、日志检查。我把每个都拆开讲,配置模板直接抄就行。
4.1 静态站点部署与权限踩坑
假设我要在/var/www/mysite放一个静态站点。先创建目录并写入测试页面:
sudo mkdir -p /var/www/mysite sudo tee /var/www/mysite/index.html >/dev/null <<'EOF' <!DOCTYPE html> <html> <head><title>mysite</title></head> <body><h1>Hello from mysite</h1></body> </html> EOF接着在 sites-available 里新建配置:
sudo tee /etc/nginx/sites-available/mysite >/dev/null <<'EOF' server { listen 80; server_name mysite.local; root /var/www/mysite; index index.html; } EOF然后建立软链接启用站点:
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/这里有个容易踩的坑:默认的/etc/nginx/sites-enabled/default依然占用着 80 端口。如果你新站点也用 80,会遇到监听冲突。稳妥做法是删掉默认站点的软链接:
sudo rm /etc/nginx/sites-enabled/default然后测试配置并重载:
sudo nginx -t sudo systemctl reload nginxnginx -t会返回syntax is ok和test is successful。看到这两条再 reload,基本不会出问题。关于权限,我记得第一次配置时把站点目录放在自己 home 目录下面,结果 Nginx 报 403。原因很简单:Nginx 的 worker 进程以www-data用户运行,而 home 目录默认权限是 750,www-data 根本没有权限走进去。解决方案有两个:一是把站点目录放在/var/www下,二是给 home 目录加执行权限。我建议直接用系统约定俗成的/var/www,省得后面为了权限折腾。
4.2 反向代理与 location 工作流
Nginx 最常见的场景是反向代理。比如我有个 Node 服务跑在127.0.0.1:3000,想让外部通过 80 端口访问,配置如下:
server { listen 80; server_name api.example.com; location /api/ { proxy_pass http://127.0.0.1:3000/api/; 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; } }这一段不理解 location 工作机制的人最容易搞错。Nginx 对 location 的选择并不是按配置文件里的书写顺序从上到下匹配这么简单,它有自己的一套优先级规则:精确匹配location = /path优先级最高;其次是^~前缀匹配;再接下来是正则匹配,按书写顺序依次测试;最后才是不带符号的前缀匹配。一旦命中一个 location,后面的其他 location 不会继续参与决策。
这是“nginx 中 location 工作流”最关键的一点。另一个高频坑是proxy_pass后面到底带不带路径。如果 location 是/api/,而 proxy_pass 写成http://127.0.0.1:3000,不带尾部的/api/,则用户的/api/user请求会被完整传给后端,即后端收到/api/user。如果 proxy_pass 写的是http://127.0.0.1:3000/,那么/api/这段前缀会被剥掉,后端收到的是/user。我因为这两者混淆吃过不少亏,现在的习惯是:后端路由本身就带/api前缀时,proxy_pass 就不重复加;后端不带前缀时,proxy_pass 就要按需保留或去掉路径。改完配置后一定用 curl 测一下实际转发的路径是否和预期一致。
4.3 多站点、多端口与自定义域名开发环境配置
开发环境里经常需要一台虚拟机同时跑多个站点。比如我本地的 Ubuntu 虚拟机 IP 是192.168.1.10,想在该虚拟机上同时托管 site1 和 site2。常见做法有两种:同一端口用不同server_name,或者不同端口各开一个 server。
先说同一端口加域名区分。修改宿主机的 hosts 文件,把自定义域名指向虚拟机 IP。Windows 在C:\Windows\System32\drivers\etc\hosts,Linux/macOS 在/etc/hosts,写入:
192.168.1.10 site1.local 192.168.1.10 site2.local然后在虚拟机 Nginx 里为两个站点分别建配置。第一个站点:
server { listen 80; server_name site1.local; root /var/www/site1; }第二个站点:
server { listen 80; server_name site2.local; root /var/www/site2; }浏览器里打开http://site1.local,Nginx 会根据 HTTP 请求里的 Host 字段自动选择对应 server 块。这里有个前提:网站根目录都要建好,并且文件能让 www-data 用户读取。
另一种场景是不同的服务监听不同端口,比如 site1 走 8081,site2 走 8082。配置就改成:
server { listen 8081; server_name site1.local; root /var/www/site1; }这种方式适合后端开发时多个框架服务各自占用端口的情况。配合反向代理,可以做到:外部访问http://site1.local时,Nginx 反代到本机的 8081;访问http://site2.local时,反代到 8082。结构清晰,互不干扰。我在本地开发多端口环境时就是这么玩的,等上线时再把 hosts 改成真实的 DNS 解析,配置文件完全不用动。
4.4 日志与状态检查要养成习惯
Nginx 的问题排查很大程度上依赖日志。默认情况下,访问日志在/var/log/nginx/access.log,错误日志在/var/log/nginx/error.log。排查问题时实时看日志很有用:
sudo tail -f /var/log/nginx/error.logerror.log 里出现 403、404、connect() failed 等信息时,基本能定位是权限问题、路径问题还是后端服务没启动。access.log 主要看请求的状态码和来源,例如出现大量 499 说明客户端提前断开,此时要检查后端处理速度。
状态检查除了systemctl status nginx,还可以用curl看响应头:
curl -I http://127.0.0.1返回 HTTP/1.1 200 OK 说明 Nginx 正常。如果你想看当前生效的完整配置,用:
sudo nginx -T这个命令会把 include 进来的所有配置文件合并输出。当你怀疑“改的文件到底有没有生效”时,它是排查利器。
5. 常见问题与排查技巧实录
我把实际使用中遇到的典型问题整理成速查表,每一条都是真实踩过坑后的经验。
5.1 80 端口被占用导致启动失败
如果安装后服务启动失败,systemctl status nginx显示bind() to 0.0.0.0:80 failed,说明有其他程序占了 80 端口。最常见的是 Apache,也可能是其他 Web 服务。先找到占用进程:
sudo lsof -i :80看到进程名和 PID 后,如果是 Apache 且你不需要它,直接停掉并禁用开机自启:
sudo systemctl stop apache2 sudo systemctl disable apache2然后再启动 Nginx。如果你其他服务必须用 80,那么可以把 Nginx 的默认站点监听改到其他端口,但这属于应急方案,不推荐长期使用。
5.2 静态文件总是 403 Forbidden
403 通常是权限问题。Nginx 进程以www-data用户运行,它需要对你配置的 root 目录有读和执行权限。排查步骤很简单:
sudo ls -ld /var/www/mysite如果目录所有者是 root 且权限是 755,一般没问题。如果站点文件放在了/home/ubuntu/project这种地方,home 目录可能是 750,www-data 无法进入。我建议把项目文件复制到/var/www,或者给上层目录加o+x执行权限。千万不要图省事把整个根目录都chmod 777,那会引入安全风险。
5.3 改了配置但访问页面没变化
这种情况通常不是 Nginx 的锅。改完配置文件后,要先nginx -t确认语法没问题,再systemctl reload nginx平滑重载。reload 不会中断已有连接,正在处理的长连接会继续完成,但新请求会使用新配置。我见过有人改完配置直接systemctl restart nginx,这本身没错,但对生产环境来说不是最佳做法。
另一个容易忽略的是浏览器缓存。静态页面改完后,浏览器还保留旧内容,强制刷新(Ctrl+Shift+R)或开无痕窗口就能看到新效果。先排除浏览器缓存,再去怀疑 Nginx 配置没生效。
5.4 并发连接数不够用
Nginx 报 “worker_connections are not enough” 或者系统出现 too many open files 时,需要优化连接数。修改/etc/nginx/nginx.conf:
worker_processes auto; events { worker_connections 10240; }worker_processes auto让 Nginx 按 CPU 核数生成 worker 进程。worker_connections表示每个 worker 进程能同时打开的最大连接数,这个值不是越大越好,还要受系统文件描述符限制。查看当前限制:
ulimit -n如果默认是 1024,那么就算 worker_connections 配成 20000 也没用。对 systemd 管理的 Nginx,在/etc/systemd/system/nginx.service.d/override.conf里加:
[Service] LimitNOFILE=65535然后sudo systemctl daemon-reload && sudo systemctl restart nginx。别忘了调高系统级文件描述符限制,否则重启后仍然会撞墙。这个组合拳是应对“最大并发连接数经常超”问题最直接的方法。
6. 最后说点我自己的维护习惯
关于 Ubuntu 上装 Nginx,我最想强调的是“稳定、可重复、少折腾”。所以安装阶段用 apt,业务配置阶段遵循 sites-available 与 sites-enabled 的分离结构,排查阶段先看日志再动手改配置。
我自己有个小习惯,就是给 shell 加一个常用别名:
alias ng.reload='sudo nginx -t && sudo systemctl reload nginx'每次改完配置只敲三个字母,先检查语法,通过后立刻平滑重载。这套流程用了很久,基本没因为改动配置把服务弄挂过。
另外还有一个小建议:第一次配置好后,立刻做一次/etc/nginx目录的备份。复制出来的文件不一定要用,但哪天你手误把整个目录删了,有一个备份就能迅速恢复现场:
sudo cp -a /etc/nginx /etc/nginx.bak以后每次调优前也照这个思路来,改文件前先备份,改完测试通过再 reload。Nginx 本身是个很皮实的软件,绝大多数故障都是配置细节和权限引起的。把这些基础习惯养好,你在 Ubuntu 上用它自然就顺手了。