从零开始:Nginx 服务器安装、配置与实战使用完全指南
在现代 Web 服务架构中,Nginx 凭借其高性能、高并发、低资源消耗的特性,成为了全球最受欢迎的 Web 服务器之一,同时还能承担反向代理、负载均衡、动静分离等核心角色。无论是搭建个人网站、企业级应用,还是构建微服务架构,Nginx 都是不可或缺的工具。本文将从环境准备到实战场景,带你一步步掌握 Nginx 的安装、核心配置与实际应用,即使是 Linux 新手也能轻松上手。
一、环境准备:明确前提与工具
在开始安装前,需确认你的环境满足以下条件,避免后续操作出现兼容性问题:
- 操作系统 :主流 Linux 发行版(本文以 Ubuntu 22.04 LTS 和 CentOS Stream 9 为例,覆盖 Debian 系与 RHEL 系两大阵营,Windows/macOS 可参考思路,但生产环境建议使用 Linux);
- 权限要求 :拥有
sudo管理员权限(所有安装、配置命令需管理员权限执行); - 网络环境:服务器可正常联网(用于通过包管理器或官方源下载 Nginx 软件包);
- 工具准备:终端(本地终端或远程 SSH 连接,如 Xshell、FinalShell、iTerm2);
- 端口检查 :确保 80 端口(HTTP)、443 端口(HTTPS)未被其他服务占用(如 Apache、IIS,可通过
sudo lsof -i :80检查)。
二、第一步:Nginx 安装(分系统 + 官方源,避免版本过旧)
不同 Linux 发行版的默认软件源中,Nginx 版本可能较旧(如 Ubuntu 22.04 默认源为 1.18 版,最新稳定版为 1.24 版)。为了使用最新特性和安全补丁,推荐通过 Nginx 官方源安装,以下是详细步骤。
2.1 Ubuntu 22.04 LTS(Debian 系)安装步骤
步骤 1:导入 Nginx 官方 GPG 密钥(验证包完整性)
官方源的软件包需通过 GPG 密钥验证,先导入密钥以确保安装包未被篡改:
sudo apt update -y
sudo apt install -y curl gnupg2 ca-certificates lsb-release
# 导入官方密钥
curl https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
步骤 2:添加 Nginx 官方源
根据系统版本添加对应源(Ubuntu 22.04 对应 jammy 版本):
# 写入官方源配置
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu/ $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
# 锁定稳定版(避免自动升级到测试版)
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/90nginx
步骤 3:安装 Nginx
更新源列表后,安装最新稳定版 Nginx:
sudo apt update -y
sudo apt install -y nginx
步骤 4:启动服务并设置开机自启
Ubuntu 安装完成后,Nginx 会自动启动,需确认状态并配置开机自启:
# 查看服务状态(显示 active (running) 即为正常)
sudo systemctl status nginx
# 设置开机自启(默认已启用,执行此命令确保)
sudo systemctl enable nginx
2.2 CentOS Stream 9(RHEL 系)安装步骤
步骤 1:安装 EPEL 源(依赖前置)
CentOS 官方源不含 Nginx,需先安装 Extra Packages for Enterprise Linux(EPEL)源:
sudo dnf install -y epel-release
步骤 2:添加 Nginx 官方源
创建官方源配置文件:
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
(注:nginx-stable 为稳定版,nginx-mainline 为开发版,默认启用稳定版,无需修改)
步骤 3:安装 Nginx
sudo dnf install -y nginx
步骤 4:启动服务 + 开放防火墙端口
CentOS 默认启用 firewalld 防火墙,需手动开放 80 端口(HTTP),否则外部无法访问:
# 启动 Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 开放 80 端口(永久生效)
sudo firewall-cmd --permanent --add-port=80/tcp
# 重载防火墙规则(使配置生效)
sudo firewall-cmd --reload
# 验证服务状态
sudo systemctl status nginx
2.3 通用验证:确认 Nginx 安装成功
无论哪种系统,安装完成后可通过两种方式验证:
- 终端命令验证 :执行
nginx -v,输出类似nginx version: nginx/1.24.0,说明版本正确; - 浏览器访问验证 :在本地浏览器输入服务器 IP(如
http://192.168.1.100),若看到 Nginx 默认欢迎页面(蓝色背景,显示 "Welcome to nginx!"),则安装成功。
三、第二步:Nginx 核心配置详解(从基础到进阶)
Nginx 的配置文件结构清晰,核心逻辑是「主配置文件 + 子配置文件」,便于管理多网站和模块化配置。掌握以下配置,可满足 90% 的 Web 服务需求。
3.1 配置文件目录(分系统,关键!)
首先明确配置文件的位置,避免后续修改时找不到文件:
| 系统 | 主配置文件 | 子配置文件目录(虚拟主机) | 网站根目录(默认) | 日志文件目录 |
|---|---|---|---|---|
| Ubuntu 22.04 | /etc/nginx/nginx.conf |
/etc/nginx/conf.d/ |
/usr/share/nginx/html |
/var/log/nginx/ |
| CentOS Stream 9 | /etc/nginx/nginx.conf |
/etc/nginx/conf.d/ |
/usr/share/nginx/html |
/var/log/nginx/ |
- 主配置文件(nginx.conf) :定义全局参数(如 worker 进程数、事件模型、日志格式),一般不建议直接修改,而是通过
include /etc/nginx/conf.d/*.conf;加载子配置; - 子配置文件目录(conf.d/) :存放单个网站的配置(虚拟主机配置),建议以「域名.conf」命名(如
www.site1.com.conf),便于区分; - 默认根目录 :存放默认网页文件,访问
http://服务器IP时,Nginx 会加载该目录下的index.html; - 日志目录 :包含访问日志(
access.log)和错误日志(error.log),用于排查问题。
3.2 核心配置 1:修改默认网站根目录
默认根目录 /usr/share/nginx/html 可能不符合需求(如想将网页文件放在 /home/yourname/www),可按以下步骤修改:
步骤 1:创建新根目录并设置权限
# 创建新目录(以 /home/yourname/www 为例,yourname 替换为你的用户名)
mkdir -p /home/yourname/www
# 赋予 Nginx 访问权限(Nginx 运行用户:Ubuntu/CentOS 均为 nginx)
sudo chown -R nginx:nginx /home/yourname/www
# 设置目录权限(所有者可读写执行,其他用户只读执行)
sudo chmod -R 755 /home/yourname/www
步骤 2:修改子配置文件
创建自定义子配置文件(不建议修改默认的 default.conf,便于后续恢复):
# Ubuntu/CentOS 通用命令,创建 site1 配置文件
sudo nano /etc/nginx/conf.d/www.site1.com.conf
粘贴以下内容(替换 www.site1.com 为你的域名,无域名可用服务器 IP):
# 虚拟主机配置:www.site1.com
server {
listen 80; # 监听 80 端口(HTTP)
server_name www.site1.com site1.com; # 绑定的域名(多个域名用空格分隔)
# 网站根目录(替换为你创建的目录)
root /home/yourname/www;
# 默认首页(按顺序查找,优先加载 index.html)
index index.html index.htm;
# 访问日志配置(记录所有访问请求)
access_log /var/log/nginx/site1_access.log main;
# 错误日志配置(记录服务器错误,级别为 error)
error_log /var/log/nginx/site1_error.log error;
# 目录访问控制(可选,禁止列出目录文件)
location / {
try_files $uri $uri/ =404; # 尝试访问文件,不存在则返回 404
autoindex off; # 关闭目录索引(避免他人看到目录结构)
}
}
步骤 3:检查配置 + 重启 Nginx
Nginx 配置文件有语法检查功能,修改后必须先检查,避免语法错误导致服务启动失败:
# 检查配置文件语法(无输出则表示语法正确)
sudo nginx -t
# 重启 Nginx 使配置生效(平滑重启,不中断现有连接)
sudo nginx -s reload
步骤 4:测试
在新根目录创建测试页面:
echo "<h1>My First Nginx Site</h1>" > /home/yourname/www/index.html
浏览器访问 http://www.site1.com(或服务器 IP),若显示 "My First Nginx Site",说明根目录修改成功。
3.3 核心配置 2:配置虚拟主机(多网站部署)
若需在一台服务器上部署多个网站(如 www.site1.com 和 www.site2.com),只需为每个网站创建独立的子配置文件,Nginx 会自动通过 server_name 区分请求。
步骤 1:创建第二个网站的根目录与测试文件
# 创建 site2 根目录
mkdir -p /home/yourname/www2
# 设置权限
sudo chown -R nginx:nginx /home/yourname/www2
sudo chmod -R 755 /home/yourname/www2
# 创建测试页面
echo "<h1>Welcome to Site2 (Nginx)</h1>" > /home/yourname/www2/index.html
步骤 2:创建 site2 虚拟主机配置
sudo nano /etc/nginx/conf.d/www.site2.com.conf
粘贴以下内容:
server {
listen 80;
server_name www.site2.com site2.com; # 绑定第二个域名
root /home/yourname/www2;
index index.html index.htm;
access_log /var/log/nginx/site2_access.log main;
error_log /var/log/nginx/site2_error.log error;
location / {
try_files $uri $uri/ =404;
autoindex off;
}
}
步骤 3:生效配置并测试
# 检查语法
sudo nginx -t
# 重启 Nginx
sudo nginx -s reload
-
域名解析 :若有真实域名,需在域名解析平台(阿里云、腾讯云)将
www.site2.com解析到服务器 IP; -
本地测试(无域名) :修改本地电脑的
hosts文件(Windows:C:\Windows\System32\drivers\etc\hosts;Linux/macOS:/etc/hosts),添加:plaintext
服务器IP www.site1.com 服务器IP www.site2.com
浏览器分别访问两个域名,显示对应测试页面,说明虚拟主机配置成功。
3.4 核心配置 3:动静分离(提升性能关键)
Nginx 处理静态资源(HTML、CSS、JS、图片、视频)的性能远高于动态资源(PHP、Java 接口),通过「动静分离」可让 Nginx 直接处理静态请求,动态请求转发给后端服务(如 PHP-FPM、Tomcat),大幅提升整体性能。
以「静态资源由 Nginx 处理,PHP 动态请求转发给 PHP-FPM」为例:
步骤 1:安装 PHP-FPM(后端服务)
# Ubuntu 安装 PHP-FPM
sudo apt install -y php8.1-fpm
# CentOS 安装 PHP-FPM
sudo dnf install -y php-fpm
# 启动 PHP-FPM 并设置开机自启
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
步骤 2:修改 Nginx 配置,实现动静分离
编辑 www.site1.com.conf,添加动态请求转发规则:
server {
listen 80;
server_name www.site1.com;
root /home/yourname/www;
index index.php index.html index.htm; # 优先加载 index.php
access_log /var/log/nginx/site1_access.log main;
error_log /var/log/nginx/site1_error.log error;
# 1. 静态资源处理:Nginx 直接返回(匹配 js/css/png 等后缀)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|mp4|avi)$ {
expires 7d; # 设置缓存时间(7天),减少重复请求
add_header Cache-Control "public, max-age=604800"; # 缓存控制头
}
# 2. 动态资源处理:PHP 请求转发给 PHP-FPM
location ~ \.php$ {
# 确保文件存在,避免恶意请求
try_files $uri =404;
# PHP-FPM 监听地址(Ubuntu/CentOS 路径一致)
fastcgi_pass unix:/run/php/php-fpm.sock;
# 加载 PHP 配置文件(Nginx 自带)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
步骤 3:测试动静分离
-
在
/home/yourname/www目录创建test.html(静态)和test.php(动态):# 静态文件 echo "<h1>Static File (Nginx)</h1>" > /home/yourname/www/test.html # 动态文件(输出 PHP 信息) echo "<?php phpinfo(); ?>" > /home/yourname/www/test.php -
浏览器访问:
- 静态资源:
http://www.site1.com/test.html,直接显示静态内容; - 动态资源:
http://www.site1.com/test.php,显示 PHP 信息页面,说明动态请求已转发给 PHP-FPM。
- 静态资源:
3.5 核心配置 4:启用 HTTPS(Let's Encrypt 免费证书)
为网站启用 HTTPS 可提升安全性(加密传输)和搜索引擎排名,通过 Let's Encrypt 可免费获取 SSL 证书,配合 certbot 工具可自动配置和续期。
步骤 1:安装 certbot
# Ubuntu 安装 certbot
sudo apt install -y certbot python3-certbot-nginx
# CentOS 安装 certbot
sudo dnf install -y certbot python3-certbot-nginx
步骤 2:自动获取证书并配置 Nginx
# 为 www.site1.com 配置 HTTPS(自动修改 Nginx 配置)
sudo certbot --nginx -d www.site1.com
按提示操作:
- 输入邮箱(用于证书到期提醒);
- 同意服务条款(输入
A); - 是否共享邮箱(可选,输入
N); - 是否将 HTTP 重定向到 HTTPS(推荐输入
2,强制 HTTPS)。
步骤 3:验证 HTTPS
浏览器访问 https://www.site1.com,地址栏显示「小绿锁」,说明 HTTPS 配置成功。证书有效期为 90 天,certbot 会自动创建定时任务续期(可通过 sudo crontab -l 查看),无需手动操作。
四、第三步:Nginx 实战使用场景(解决实际问题)
掌握基础配置后,我们来看几个高频实战场景,将 Nginx 应用到实际项目中。
4.1 场景 1:反向代理(隐藏后端服务地址)
反向代理可将客户端请求转发给后端服务(如 Tomcat、Node.js、Python Flask),同时隐藏后端服务的真实 IP 和端口,提升安全性。
以「将 https://www.site1.com/api 转发给后端 Node.js 服务(运行在 127.0.0.1:3000)」为例:
-
编辑
www.site1.com.conf,添加反向代理规则:server { listen 443 ssl; # 监听 HTTPS 端口 server_name www.site1.com; # SSL 证书配置(certbot 自动添加,无需修改) ssl_certificate /etc/letsencrypt/live/www.site1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.site1.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; root /home/yourname/www; index index.html; # 反向代理:/api 路径转发给 Node.js 服务 location /api { proxy_pass http://127.0.0.1:3000; # 后端服务地址 proxy_set_header Host $host; # 传递主机头 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 传递协议(http/https) } } -
启动 Node.js 服务(示例:用 Express 写一个简单接口):
// app.js const express = require('express'); const app = express(); app.get('/api/hello', (req, res) => { res.send({ message: 'Hello from Node.js (Nginx Reverse Proxy)' }); }); app.listen(3000, () => console.log('Node.js running on 127.0.0.1:3000')); -
浏览器访问
https://www.site1.com/api/hello,可看到 Node.js 返回的 JSON 数据,说明反向代理生效。
4.2 场景 2:负载均衡(分摊高并发压力)
当后端服务压力过大(如秒杀、高并发访问)时,可通过 Nginx 负载均衡将请求分发到多台后端服务器,避免单点故障,提升服务可用性。
以「3 台 Tomcat 服务器(192.168.1.101:8080、192.168.1.102:8080、192.168.1.103:8080)实现负载均衡」为例:
-
编辑
www.site1.com.conf,添加负载均衡配置:# 1. 定义负载均衡集群(upstream 块,放在 server 块外) upstream tomcat_cluster { # 后端服务器列表,权重默认 1(权重越高,分配到的请求越多) server 192.168.1.101:8080 weight=1; server 192.168.1.102:8080 weight=2; # 权重 2,接收更多请求 server 192.168.1.103:8080 weight=1; # 可选配置:健康检查(失败后 30 秒内不再分配请求) server 192.168.1.101:8080 max_fails=3 fail_timeout=30s; } server { listen 80; server_name www.site1.com; # 2. 将所有请求转发给负载均衡集群 location / { proxy_pass http://tomcat_cluster; # 指向 upstream 集群名 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } -
测试负载均衡:在每台 Tomcat 的
webapps/ROOT/index.html中添加不同标识(如Server 101、Server 102),多次刷新http://www.site1.com,可看到页面交替显示不同服务器的标识,说明请求已被分发。
4.3 场景 3:日志分析(排查问题 + 监控访问)
Nginx 日志记录了所有访问请求和错误信息,通过分析日志可排查问题(如 404、502 错误)、监控访问量(如高峰时段、热门页面)。
常用日志查看命令
# 1. 实时查看错误日志(按 Ctrl+C 退出,排查实时错误)
sudo tail -f /var/log/nginx/site1_error.log
# 2. 查看最近 100 条访问日志(分析近期请求)
sudo tail -n 100 /var/log/nginx/site1_access.log
# 3. 统计访问量最高的前 10 个 IP(识别异常访问)
sudo awk '{print $1}' /var/log/nginx/site1_access.log | sort | uniq -c | sort -nr | head -10
# 4. 统计 404 错误的请求路径(排查缺失文件)
sudo grep " 404 " /var/log/nginx/site1_access.log | awk '{print $7}' | sort | uniq -c | sort -nr
# 5. 统计访问量最高的前 10 个页面(分析热门内容)
sudo awk '{print $7}' /var/log/nginx/site1_access.log | sort | uniq -c | sort -nr | head -10
五、常见问题与解决方案(避坑指南)
在使用 Nginx 过程中,难免会遇到问题,以下是高频问题的解决方法:
5.1 问题 1:Nginx 启动失败,提示「address already in use」
- 原因:80 或 443 端口被其他服务占用(如 Apache、httpd);
- 解决方案 :
- 查找占用端口的进程:
sudo lsof -i :80或sudo netstat -tulpn | grep :80; - 停止占用进程:
sudo systemctl stop apache2(或对应服务名); - 若需保留其他服务,可修改 Nginx 监听端口(如将
listen 80改为listen 8080,访问时需加端口:http://服务器IP:8080)。
- 查找占用端口的进程:
5.2 问题 2:访问 PHP 页面显示源码,不执行
- 原因:Nginx 未配置 PHP 转发规则,直接将 PHP 文件作为静态资源返回;
- 解决方案 :
- 确认已安装 PHP-FPM 并启动;
- 在 Nginx 配置中添加
location ~ \.php$块(参考 3.4 节动静分离配置); - 检查
fastcgi_pass路径是否正确(默认路径为/run/php/php-fpm.sock)。
5.3 问题 3:HTTPS 访问提示「证书无效」
- 原因:域名解析未生效、证书文件路径错误、证书已过期;
- 解决方案 :
- 验证域名解析:
ping www.site1.com确认解析到正确 IP; - 检查证书路径:查看 Nginx 配置中
ssl_certificate和ssl_certificate_key路径是否正确(默认在/etc/letsencrypt/live/域名/下); - 续期证书:若证书过期,执行
sudo certbot renew手动续期。
- 验证域名解析:
5.4 问题 4:反向代理时后端服务获取不到客户端真实 IP
-
原因 :未配置
proxy_set_header,后端服务将 Nginx 服务器 IP 当作客户端 IP; -
解决方案 :在反向代理配置中添加以下头信息:
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;后端服务需读取
X-Real-IP或X-Forwarded-For头获取真实 IP(如 Java 用request.getHeader("X-Real-IP"))。
六、总结与进阶学习
本文从「安装→配置→实战」三个维度,覆盖了 Nginx 的核心知识点:
- 安装:通过官方源安装最新稳定版,避免版本过旧导致的安全风险;
- 配置:掌握虚拟主机、动静分离、HTTPS 等基础配置,满足多场景需求;
- 实战:通过反向代理、负载均衡、日志分析,解决实际项目中的高并发、高可用问题。
若想进一步深入 Nginx,可学习以下进阶内容:
- Nginx 性能优化 :调整
worker_processes(建议等于 CPU 核心数)、worker_connections(单进程最大连接数)、缓存策略等; - Nginx 高可用:通过 Keepalived 实现 Nginx 主从切换,避免单点故障;
- Nginx 插件开发:基于 Lua 脚本(OpenResty)扩展 Nginx 功能(如限流、鉴权)。
Nginx 的官方文档(Nginx Official Documentation)是最好的学习资料,建议结合实际场景多动手实践,才能真正掌握这一强大的工具。
