Web 技术与 Nginx 网站环境部署超详细全教程
本教程从零开始,完整覆盖Web 技术核心原理 、Nginx 全场景部署 、生产级实战配置 、问题排查与优化四大核心模块,兼顾新手入门与生产环境落地,所有操作均提供可直接复制的命令与配置,全程无跳步。
一、Web 技术核心基础(先懂原理,再做部署)
1.1 Web 技术完整架构体系
Web 技术是实现浏览器与服务器交互的全套技术栈,分为 5 大核心层级,Nginx 是其中承上启下的核心枢纽:
表格
| 层级 | 核心作用 | 主流技术栈 |
|---|---|---|
| 客户端层 | 用户交互、页面渲染 | HTML/CSS/JavaScript、React/Vue/Angular、小程序 |
| 网络传输层 | 数据加密与传输 | HTTP/HTTPS、HTTP/2、HTTP/3、TCP/IP |
| Web 服务层 | 接收请求、分发处理、资源返回 | Nginx、Apache、Tomcat、Caddy |
| 应用服务层 | 业务逻辑处理、数据计算 | Node.js、Python(Flask/Django)、Java(SpringBoot)、Go |
| 数据存储层 | 数据持久化存储 | MySQL/PostgreSQL、Redis、MongoDB |
1.2 一次完整的 Web 请求流程(Nginx 的核心角色)
当用户在浏览器输入网址后,完整流程如下,你将清晰知道 Nginx 在每一步的作用:
- 域名解析:浏览器通过 DNS 将域名解析为服务器公网 IP
- TCP 连接:浏览器与服务器 IP 的对应端口(默认 80/443)建立 TCP 连接
- 请求接收:Nginx 作为 Web 服务器,最先接收到浏览器的 HTTP/HTTPS 请求
- 请求处理 :
- 若为静态资源请求(HTML/CSS/JS/ 图片):Nginx 直接从服务器磁盘读取文件,返回给浏览器
- 若为动态接口请求:Nginx 通过反向代理,将请求转发给后端应用服务(Node.js/Java 等)处理
- 结果返回:后端处理完成后,结果经 Nginx 封装,返回给浏览器
- 页面渲染:浏览器接收资源,解析渲染出用户可见的页面
- 连接关闭:请求完成后,按配置规则关闭 TCP 连接
1.3 Nginx 的核心功能与核心优势
Nginx 是一款轻量级、高性能的 HTTP 和反向代理服务器,也是目前生产环境 Web 服务的首选,核心能力:
- 静态资源托管:高性能处理静态文件,远超 Apache
- 反向代理:隐藏后端服务,统一请求入口,适配前后端分离架构
- 负载均衡:将请求分发至多台后端服务器,实现高可用与性能扩容
- HTTPS 加密:一站式配置 SSL 证书,实现全站 HTTPS
- 动静分离、缓存加速、限流防盗链、跨域处理等一站式 Web 能力
- 核心优势:高并发、低内存占用、高稳定性、配置灵活、模块化扩展
二、部署前置准备(避坑第一步,必做)
2.1 服务器与系统环境要求
(1)服务器选择
- 新手入门:推荐阿里云 / 腾讯云 / 华为云的轻量应用服务器 ,1 核 2G 配置起步,系统选择 Ubuntu 22.04 LTS(最稳定、新手最友好,本教程默认基于此系统)
- 本地测试:可使用 VMware/VirtualBox 安装 Ubuntu 虚拟机,或 Windows WSL2 子系统
- 生产环境:推荐 2 核 4G 以上配置,Ubuntu 22.04 LTS / CentOS Stream 9 / Rocky Linux 9
(2)核心前提
- 服务器公网 IP(本地测试可使用 127.0.0.1)
- 服务器 root 权限,或具备 sudo 权限的普通用户
- 服务器防火墙 / 安全组已开放对应端口:80(HTTP)、443(HTTPS)、22(SSH 远程连接)
2.2 远程连接服务器
-
Windows 用户:推荐使用 FinalShell、Xshell、Windows Terminal 自带的 SSH
-
Mac/Linux 用户:直接使用系统终端自带的 SSH
-
连接命令 (终端执行):
bash
运行
# 格式:ssh 用户名@服务器公网IP ssh root@123.123.123.123 # 回车后输入服务器密码,即可登录成功
2.3 系统基础环境配置(必做,否则后续部署必踩坑)
(1)切换到 root 权限(避免权限不足)
# 若已用root登录,跳过此步
sudo -i
(2)更新系统软件源与系统组件
# Ubuntu/Debian系统
apt update -y && apt upgrade -y
# CentOS/Rocky/AlmaLinux系统
yum update -y
(3)关闭 SELinux(仅 CentOS/Rocky 系列,Ubuntu 默认关闭)
# 临时关闭
setenforce 0
# 永久关闭(修改配置文件,重启后生效)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
(4)防火墙配置(开放核心端口)
# Ubuntu/Debian(ufw防火墙)
# 1. 查看防火墙状态
ufw status
# 2. 开放SSH(22)、HTTP(80)、HTTPS(443)端口
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
# 3. 启用防火墙(若未启用)
ufw enable
# 4. 重载防火墙规则
ufw reload
# CentOS/Rocky(firewalld防火墙)
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
重要提醒:云服务器除了系统防火墙,还需要在云厂商控制台的安全组 / 防火墙中,开放 22/80/443 端口,否则浏览器无法访问!
(5)安装必备基础工具
# Ubuntu/Debian
apt install -y vim curl wget net-tools gcc make pcre pcre-devel zlib zlib-devel openssl openssl-devel
# CentOS/Rocky
yum install -y vim curl wget net-tools gcc make pcre pcre-devel zlib zlib-devel openssl openssl-devel
三、Nginx 全版本安装教程(3 种方式,覆盖所有场景)
3.1 方式一:系统包管理器一键安装(新手首选,最简单)
适合新手入门、测试环境,优点是操作简单、自动配置环境变量和开机自启,缺点是版本通常不是最新稳定版。
Ubuntu/Debian 系统
# 1. 一键安装
apt install nginx -y
# 2. 验证安装是否成功
nginx -v
CentOS/Rocky/AlmaLinux 系统
# 1. 一键安装
yum install nginx -y
# 2. 验证安装是否成功
nginx -v
3.2 方式二:Nginx 官方源安装(获取最新稳定版)
解决系统包管理器版本过老的问题,同时保留包管理器的便捷性,适合不想编译、又需要用最新版的场景。
# 1. 安装依赖
apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# 2. 导入Nginx官方签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# 3. 添加Nginx官方稳定版源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# 4. 设置官方源优先级
echo "Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900" | tee /etc/apt/preferences.d/99nginx
# 5. 更新源并安装最新稳定版Nginx
apt update -y && apt install nginx -y
# 6. 验证版本
nginx -v
3.3 方式三:源码编译安装(生产环境首选,最高自由度)
生产环境 90% 以上的场景都用此方式,优点是可自定义安装路径、按需添加第三方模块、性能最优,缺点是操作稍复杂。
步骤 1:下载 Nginx 源码包
先访问Nginx 官方下载页,获取最新稳定版源码地址,本教程以nginx-1.26.0(最新稳定版)为例:
# 1. 进入/usr/local目录(常规安装目录)
cd /usr/local
# 2. 下载源码包
wget https://nginx.org/download/nginx-1.26.0.tar.gz
# 3. 解压源码包
tar -zxvf nginx-1.26.0.tar.gz
# 4. 进入解压后的目录
cd nginx-1.26.0
步骤 2:编译配置(自定义安装路径与模块)
核心配置参数解释:
-
--prefix:指定 Nginx 安装目录 -
--with-*:启用内置模块,这里启用了 SSL、HTTP2、重写、压缩等核心模块 -
可按需添加第三方模块(如 lua 模块、缓存模块等)
执行编译配置
./configure
--prefix=/usr/local/nginx
--with-http_ssl_module
--with-http_v2_module
--with-http_realip_module
--with-http_gzip_static_module
--with-http_stub_status_module
--with-pcre
步骤 3:编译与安装
# 1. 编译(根据服务器配置,等待1-3分钟)
make
# 2. 安装
make install
步骤 4:配置环境变量(全局可执行 nginx 命令)
# 1. 编辑环境变量配置文件
vim /etc/profile
# 2. 在文件末尾添加以下内容(按i进入编辑模式,粘贴后按ESC,输入:wq保存退出)
export PATH=$PATH:/usr/local/nginx/sbin
# 3. 使环境变量立即生效
source /etc/profile
# 4. 验证是否全局生效
nginx -v
步骤 5:配置 systemd 服务管理(开机自启、启停管理)
源码安装默认没有 systemd 服务,需手动配置,实现一键启停、开机自启:
# 1. 创建nginx.service服务文件
vim /usr/lib/systemd/system/nginx.service
将以下内容完整粘贴到文件中,保存退出:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
# 注意:此处路径为你的nginx安装路径的sbin/nginx,包管理器安装为/usr/sbin/nginx
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 2. 重载systemd配置
systemctl daemon-reload
3.4 Nginx 基础操作命令(全版本通用,必记)
表格
| 操作 | 命令 | 适用场景 |
|---|---|---|
| 启动 Nginx | systemctl start nginx |
首次安装后启动、停止后重新启动 |
| 停止 Nginx | systemctl stop nginx |
正常停止,等待请求处理完成 |
| 强制停止 | nginx -s stop |
紧急停止,直接终止进程 |
| 重载配置 | systemctl reload nginx |
修改配置后,无中断生效,生产环境首选 |
| 重启 Nginx | systemctl restart nginx |
停止后重新启动,会中断请求,非必要不使用 |
| 查看运行状态 | systemctl status nginx |
排查启动失败、运行异常 |
| 设置开机自启 | systemctl enable nginx |
服务器重启后自动启动 Nginx,必做 |
| 关闭开机自启 | systemctl disable nginx |
取消开机自启 |
| 校验配置文件 | nginx -t |
修改配置后必执行,检查是否有语法错误 |
| 查看版本 / 编译参数 | nginx -V |
查看安装版本、启用的模块、安装路径 |
3.5 安装成功验证
- 启动 Nginx:
systemctl start nginx - 设置开机自启:
systemctl enable nginx - 打开浏览器,输入服务器公网 IP,若看到 Nginx 默认欢迎页面,说明安装成功!
四、Nginx 核心配置体系全详解(新手核心,搞懂 = 搞懂 Nginx)
4.1 Nginx 目录结构全解
先搞清楚安装后的各个目录作用,避免找不到配置文件、日志文件、站点目录。
(1)包管理器安装(apt/yum)的核心目录
表格
| 目录路径 | 核心作用 |
|---|---|
/etc/nginx/ |
Nginx 配置根目录 |
/etc/nginx/nginx.conf |
Nginx 主配置文件 |
/etc/nginx/sites-available/ |
站点配置文件存放目录(分站点管理) |
/etc/nginx/sites-enabled/ |
生效的站点配置目录(软链接到 sites-available) |
/etc/nginx/conf.d/ |
自定义配置文件目录,.conf 后缀都会自动加载 |
/usr/share/nginx/html/ |
默认站点根目录,存放静态资源 |
/var/log/nginx/ |
日志目录,access.log(访问日志)、error.log(错误日志) |
/var/cache/nginx/ |
Nginx 缓存目录 |
/usr/sbin/nginx |
Nginx 执行程序 |
(2)源码编译安装的核心目录(以 /usr/local/nginx 为例)
表格
| 目录路径 | 核心作用 |
|---|---|
/usr/local/nginx/conf/ |
配置根目录,nginx.conf 为主配置文件 |
/usr/local/nginx/html/ |
默认站点根目录 |
/usr/local/nginx/logs/ |
日志目录、PID 文件存放目录 |
/usr/local/nginx/sbin/nginx |
Nginx 执行程序 |
4.2 Nginx 配置文件核心语法规则
- 配置文件由指令 和指令参数 组成,以分号
;结尾,缺一不可(新手高频报错点) - 配置块用大括号
{}包裹,支持嵌套,层级分明 - 注释用
#开头,单行注释,不生效 - 配置文件大小写敏感
- 同一层级的指令,后面的会覆盖前面的
- 修改配置后,必须执行
nginx -t校验语法,再执行systemctl reload nginx重载生效
4.3 主配置文件 nginx.conf 分层全拆解
Nginx 配置分为5 个核心层级块 ,优先级从高到低:location > server > http > events > 全局块,下面是完整的主配置文件详解,每一行都有注释。
########################### 1. 全局块 ###########################
# 作用:控制Nginx全局的核心配置,对整个服务器生效
# 运行Nginx的用户,建议用www-data(包管理器默认),不要用root,避免安全风险
user www-data;
# Nginx工作进程数,建议设置为等于CPU核心数,auto自动匹配
worker_processes auto;
# Nginx进程PID文件存放路径
pid /run/nginx.pid;
# 错误日志存放路径与日志级别,级别:debug/info/notice/warn/error/crit,生产用warn/error
error_log /var/log/nginx/error.log warn;
# 引入动态模块,编译安装的模块无需引入
include /etc/nginx/modules-enabled/*.conf;
########################### 2. events块 ###########################
# 作用:控制Nginx服务器与用户网络连接的核心配置,对连接性能影响最大
events {
# 单个工作进程的最大连接数,默认1024,生产环境建议调至10240
worker_connections 10240;
# 开启高效网络连接模式,Linux系统默认开启
use epoll;
# 允许一个进程同时接受多个新连接
multi_accept on;
}
########################### 3. http块 ###########################
# 作用:HTTP/HTTPS全局配置,代理、缓存、日志、压缩等,可包含多个server块
http {
########################### 基础配置 ###########################
# 引入文件扩展名与文件类型的映射表
include /etc/nginx/mime.types;
# 默认文件类型,无法匹配时默认二进制流
default_type application/octet-stream;
# 字符集,统一设置为utf-8,避免中文乱码
charset utf-8;
########################### 日志格式配置 ###########################
# 定义访问日志格式,名为main,可自定义字段
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志存放路径,使用上面定义的main格式
access_log /var/log/nginx/access.log main;
########################### 性能优化配置 ###########################
# 开启高效文件传输模式,静态资源必开
sendfile on;
# 防止网络阻塞,配合sendfile使用
tcp_nopush on;
tcp_nodelay on;
# 长连接超时时间,单位秒,客户端与服务器的长连接保持时间
keepalive_timeout 65;
# 客户端请求头超时时间
client_header_timeout 30s;
# 客户端请求体超时时间
client_body_timeout 30s;
# 客户端最大请求体大小,限制上传文件大小,默认1m,按需调整
client_max_body_size 100m;
########################### Gzip压缩配置 ###########################
# 开启gzip压缩,减少传输体积,提升页面加载速度
gzip on;
# 压缩等级,1-9,等级越高压缩率越高,CPU占用越高,生产建议5-6
gzip_comp_level 6;
# 最小压缩文件大小,小于此值不压缩
gzip_min_length 1k;
# 需要压缩的文件类型
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 给代理服务器用,告诉代理是否压缩
gzip_vary on;
########################### 配置引入 ###########################
# 引入conf.d目录下所有.conf后缀的配置文件
include /etc/nginx/conf.d/*.conf;
# 引入sites-enabled目录下生效的站点配置
include /etc/nginx/sites-enabled/*;
}
4.4 核心虚拟主机 server 块详解
server 块就是我们常说的站点配置,一个 server 块对应一个网站(域名 / 端口),http 块中可以包含多个 server 块,实现一台服务器部署多个网站。
完整的 server 块基础模板 + 全注释
# 定义一个虚拟主机
server {
########################### 基础监听配置 ###########################
# 监听端口,HTTP默认80端口
listen 80;
# 监听IPv6的80端口,不需要可注释
listen [::]:80;
# 站点域名,多个域名用空格分隔,无域名可写服务器公网IP
server_name yourdomain.com www.yourdomain.com;
# 站点根目录,存放网站代码的路径
root /var/www/yourdomain.com/html;
# 默认首页文件,按优先级匹配
index index.html index.htm index.php;
########################### 核心location块 ###########################
# location块:匹配请求的URL路径,优先级最高,是Nginx最核心的配置
# 格式:location [匹配模式] 匹配路径 { 配置指令 }
# 1. 通用匹配,匹配所有请求
location / {
# 尝试匹配文件,找不到则返回404,静态站点核心指令
try_files $uri $uri/ =404;
}
# 2. 匹配静态资源,设置缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
# 浏览器缓存时间,30天
expires 30d;
# 不记录访问日志,减少IO
access_log off;
# 禁用ETag,配合expires使用
etag off;
# 缓存控制
add_header Cache-Control "public, no-transform";
}
# 3. 禁止访问敏感目录/文件
location ~ /\.ht {
# 禁止访问,返回403
deny all;
# 不记录错误日志
error_log off;
# 不记录访问日志
access_log off;
}
########################### 日志配置 ###########################
# 单独设置该站点的访问日志和错误日志
access_log /var/log/nginx/yourdomain.com.access.log main;
error_log /var/log/nginx/yourdomain.com.error.log warn;
}
核心知识点:location 匹配规则(新手必懂)
location 匹配优先级从高到低排序:
-
精确匹配
=:完全匹配路径,优先级最高# 仅匹配 http://yourdomain.com/login location = /login { # 配置 } -
前缀匹配
^~:匹配路径开头,匹配成功后不再匹配正则# 匹配所有以/static/开头的路径,如/static/css/style.css location ^~ /static/ { # 配置 } -
正则匹配
~(区分大小写)/~*(不区分大小写):匹配正则表达式# 匹配所有以.php结尾的路径,不区分大小写 location ~* \.php$ { # 配置 } -
普通前缀匹配:无修饰符,匹配路径开头,优先级低于正则
-
通用匹配
/:匹配所有请求,优先级最低
新手高频踩坑:root 与 alias 的区别
这两个指令都是用来指定站点资源路径,90% 的新手 404 错误都源于此:
表格
| 指令 | 用法 | 路径拼接规则 | 适用场景 |
|---|---|---|---|
| root | root 路径; | 根路径 + location 匹配的路径 | 站点根目录、通用匹配 |
| alias | alias 路径; | 直接替换 location 匹配的路径,不拼接 | 子目录别名、静态资源目录 |
示例:
# 场景:访问 http://yourdomain.com/static/image.jpg
# 1. root用法
location ^~ /static/ {
root /var/www/yourdomain.com;
# 实际查找路径:/var/www/yourdomain.com/static/image.jpg
}
# 2. alias用法
location ^~ /static/ {
alias /var/www/yourdomain.com/assets/;
# 实际查找路径:/var/www/yourdomain.com/assets/image.jpg
# 注意:alias路径末尾必须加/,root可加可不加
}
4.5 站点配置最佳实践(生产环境必遵守)
-
分站点管理 :不要把所有站点配置都写在 nginx.conf 主配置文件中,每个站点单独创建一个配置文件,放在
/etc/nginx/sites-available/目录下 -
软链接生效 :需要生效的站点,创建软链接到
/etc/nginx/sites-enabled/目录,不需要生效直接删除软链接即可,无需修改配置文件# 示例:创建站点配置文件 vim /etc/nginx/sites-available/yourdomain.com.conf # 写入server块配置,保存退出 # 创建软链接,使其生效 ln -s /etc/nginx/sites-available/yourdomain.com.conf /etc/nginx/sites-enabled/ # 校验配置 nginx -t # 重载生效 systemctl reload nginx -
配置文件命名 :用域名命名配置文件,如
yourdomain.com.conf,方便管理 -
权限配置 :站点目录权限设置为
www-data用户,避免 403 权限错误# 给站点目录设置正确的所有者和权限 chown -R www-data:www-data /var/www/yourdomain.com/html chmod -R 755 /var/www/yourdomain.com
五、全场景实战部署(手把手落地,可直接复制)
场景 1:静态网站部署(最基础,个人博客 / 企业官网)
静态网站指纯 HTML/CSS/JS 编写的网站,无后端服务,如 Vue/React 打包后的单页应用、Hexo/Hugo 静态博客。
步骤 1:创建站点目录与准备网站代码
# 1. 创建站点根目录
mkdir -p /var/www/yourdomain.com/html
# 2. 给目录设置正确的权限
chown -R www-data:www-data /var/www/yourdomain.com/html
chmod -R 755 /var/www/yourdomain.com
# 3. 上传网站代码到该目录
# 示例:创建一个测试首页文件
vim /var/www/yourdomain.com/html/index.html
写入测试 HTML 代码,保存退出:
预览
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一个Nginx站点</title>
</head>
<body>
<h1>恭喜!Nginx静态站点部署成功!</h1>
<p>这是我的第一个Nginx网站</p>
</body>
</html>
步骤 2:编写站点配置文件
vim /etc/nginx/sites-available/yourdomain.com.conf
写入完整配置,替换yourdomain.com为你的域名(无域名用服务器公网 IP):
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.html index.htm;
# 通用匹配
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, no-transform";
}
# 禁止访问敏感文件
location ~ /\.ht {
deny all;
access_log off;
error_log off;
}
# 站点日志
access_log /var/log/nginx/yourdomain.com.access.log main;
error_log /var/log/nginx/yourdomain.com.error.log warn;
}
步骤 3:生效配置与验证
# 1. 创建软链接,使配置生效
ln -s /etc/nginx/sites-available/yourdomain.com.conf /etc/nginx/sites-enabled/
# 2. 校验配置文件语法
nginx -t
# 出现如下提示,说明配置无错误:
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# 3. 重载Nginx配置,无中断生效
systemctl reload nginx
步骤 4:访问验证
- 有域名:将域名解析到服务器公网 IP,浏览器输入域名即可访问
- 无域名:浏览器直接输入服务器公网 IP,即可访问
常见问题解决
- 403 Forbidden :大概率是站点目录权限错误,执行
chown -R www-data:www-data 站点目录,或 index 文件不存在 - 404 Not Found:root 路径配置错误,或文件路径与 location 匹配规则不符,检查 root/alias 配置
- 无法访问:检查云服务器安全组 / 防火墙是否开放 80 端口,Nginx 是否正常启动
场景 2:反向代理动态后端服务(前后端分离项目必用)
反向代理是 Nginx 最核心的功能之一,将客户端的请求转发给后端的应用服务(Node.js/Flask/Django/SpringBoot),实现统一入口、隐藏后端服务、负载均衡等能力。
核心原理
浏览器请求不会直接访问后端服务,而是全部发送给 Nginx,Nginx 根据请求路径,将接口请求转发给后端服务,静态资源直接由 Nginx 返回,完美适配前后端分离架构。
实战示例:部署前后端分离项目
需求:
- 前端静态资源:Vue/React 打包后的 dist 目录,Nginx 直接托管
- 后端接口:SpringBoot/Node.js 服务,运行在服务器本地
127.0.0.1:8080,接口路径均以/api开头 - 访问域名:
api.yourdomain.com
步骤 1:准备前端资源
# 1. 创建站点目录
mkdir -p /var/www/api.yourdomain.com/html
# 2. 将前端打包后的dist目录下的所有文件,上传到该目录
# 3. 设置权限
chown -R www-data:www-data /var/www/api.yourdomain.com/html
步骤 2:编写反向代理站点配置
vim /etc/nginx/sites-available/api.yourdomain.com.conf
写入完整配置:
server {
listen 80;
listen [::]:80;
server_name api.yourdomain.com;
# 前端静态资源根目录
root /var/www/api.yourdomain.com/html;
index index.html index.htm;
# 1. 接口请求反向代理:所有以/api开头的请求,转发给后端8080服务
location ^~ /api/ {
# 核心指令:反向代理地址,后端服务的访问地址
proxy_pass http://127.0.0.1:8080/;
# 代理头信息配置,传递客户端真实信息给后端
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_read_timeout 60s;
proxy_send_timeout 60s;
# 缓冲区配置
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
}
# 2. 前端页面匹配,解决Vue/React单页应用路由刷新404问题
location / {
try_files $uri $uri/ /index.html;
}
# 3. 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, no-transform";
}
# 日志配置
access_log /var/log/nginx/api.yourdomain.com.access.log main;
error_log /var/log/nginx/api.yourdomain.com.error.log warn;
}
新手高频踩坑:proxy_pass 末尾加不加 / 的区别
这是反向代理最容易出错的点,直接决定转发后的路径是否正确:
# 场景:访问 http://api.yourdomain.com/api/user/list
# 1. proxy_pass 末尾加/
location ^~ /api/ {
proxy_pass http://127.0.0.1:8080/;
# 转发后的地址:http://127.0.0.1:8080/user/list
# 原理:/ 会把location匹配的/api/替换掉
}
# 2. proxy_pass 末尾不加/
location ^~ /api/ {
proxy_pass http://127.0.0.1:8080;
# 转发后的地址:http://127.0.0.1:8080/api/user/list
# 原理:直接拼接location匹配的路径
}
步骤 3:生效配置与验证
# 1. 创建软链接
ln -s /etc/nginx/sites-available/api.yourdomain.com.conf /etc/nginx/sites-enabled/
# 2. 校验配置
nginx -t
# 3. 重载生效
systemctl reload nginx
验证
- 确保后端服务已启动,运行在 127.0.0.1:8080
- 浏览器输入域名,可正常访问前端页面
- 前端接口请求可正常转发到后端,无跨域问题
场景 3:HTTPS 证书配置(生产环境必做,全站 HTTPS)
HTTPS 通过 SSL/TLS 加密传输,防止数据被窃听、篡改,是生产环境的必备配置,主流浏览器已将 HTTP 站点标记为不安全。
前提条件
- 已拥有域名,并已解析到服务器公网 IP
- 服务器已开放 443 端口(HTTPS 默认端口)
- 已申请 SSL 证书(分为免费证书和付费证书)
步骤 1:申请 SSL 证书
推荐两种方式,新手推荐第一种:
- 云厂商免费证书:阿里云 / 腾讯云 / 华为云均可申请免费单域名 SSL 证书,有效期 1 年,操作简单,一键下载证书文件
- Let's Encrypt 免费证书:有效期 3 个月,可自动续期,通配符域名也支持,通过 certbot 工具一键申请
本教程以云厂商下载的证书为例,证书文件通常包含:
- 公钥文件:
yourdomain.com.pem(或.crt) - 私钥文件:
yourdomain.com.key
步骤 2:上传证书到服务器
# 1. 创建证书存放目录
mkdir -p /etc/nginx/ssl/yourdomain.com
# 2. 将pem和key证书文件,上传到该目录
# 3. 设置证书文件权限
chmod 600 /etc/nginx/ssl/yourdomain.com/*
步骤 3:编写 HTTPS 站点配置
vim /etc/nginx/sites-available/yourdomain.com.conf
写入完整 HTTPS 配置,实现 HTTP 强制跳转 HTTPS,HTTP/2 开启:
# 1. HTTP 80端口配置:强制跳转HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
# 永久重定向,301跳转,权重传递
return 301 https://$server_name$request_uri;
}
# 2. HTTPS 443端口核心配置
server {
# 监听443端口,开启HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# 站点根目录
root /var/www/yourdomain.com/html;
index index.html index.htm;
########################### SSL核心配置 ###########################
# 证书文件路径
ssl_certificate /etc/nginx/ssl/yourdomain.com/yourdomain.com.pem;
# 私钥文件路径
ssl_certificate_key /etc/nginx/ssl/yourdomain.com/yourdomain.com.key;
# SSL协议配置,禁用不安全的SSLv3,只启用TLS1.2+
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件,优先使用高安全性套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# SSL会话缓存,提升HTTPS握手性能
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS配置:强制浏览器使用HTTPS访问,有效期1年
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
########################### 常规站点配置 ###########################
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, no-transform";
}
# 日志配置
access_log /var/log/nginx/yourdomain.com.https.access.log main;
error_log /var/log/nginx/yourdomain.com.https.error.log warn;
}
步骤 4:生效配置与验证
# 1. 校验配置
nginx -t
# 2. 重载生效
systemctl reload nginx
验证
- 浏览器输入
http://你的域名,会自动跳转到https://你的域名 - 浏览器地址栏出现小锁图标,说明 HTTPS 配置成功
- 可通过SSL Labs检测证书配置等级
场景 4:负载均衡集群部署(高可用 / 高并发场景)
当单台后端服务无法支撑高并发请求时,通过 Nginx 的负载均衡功能,将请求分发到多台后端服务器,实现性能扩容、高可用容灾。
核心配置模块:upstream
upstream 模块用于定义后端服务器池,配置负载均衡调度算法,server 块中通过 proxy_pass 引用该池。
完整负载均衡配置示例
需求:将/api开头的请求,分发到 3 台后端服务器,实现负载均衡
# 1. 定义后端服务器池,名为backend_server
upstream backend_server {
# 负载均衡调度算法,默认轮询,可指定权重、ip_hash等
# 轮询:默认,按顺序依次分发
# 权重weight:权重越高,分发的请求越多
# ip_hash:按客户端IP哈希,同一个IP始终访问同一台后端,解决session问题
# least_conn:优先分发到连接数最少的后端服务器
# 后端服务器列表,格式:服务器IP:端口 配置参数
server 192.168.1.101:8080 weight=3; # 权重3,分发30%的请求
server 192.168.1.102:8080 weight=2; # 权重2,分发20%的请求
server 192.168.1.103:8080 weight=1 backup; # backup:备用服务器,其他服务器宕机时启用
# 健康检查:max_fails最大失败次数,fail_timeout失败超时时间
max_fails 3;
fail_timeout 30s;
}
# 2. 站点配置,引用负载均衡池
server {
listen 80;
server_name load.yourdomain.com;
# 反向代理到负载均衡池
location ^~ /api/ {
proxy_pass http://backend_server/;
# 代理头信息配置
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;
}
}
六、Nginx 进阶优化与常用功能配置
6.1 防盗链配置(防止静态资源被其他网站盗用)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# 允许的域名,白名单,替换为你的域名
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
# 非法引用,返回403
if ($invalid_referer) {
return 403;
}
# 缓存配置
expires 30d;
access_log off;
}
6.2 跨域 CORS 配置(解决前后端分离跨域问题)
location ^~ /api/ {
# 允许的请求源,*代表所有,生产环境建议指定域名
add_header Access-Control-Allow-Origin *;
# 允许的请求方法
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
# 允许的请求头
add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
# 预检请求OPTIONS的有效期,20天
add_header Access-Control-Max-Age 1728000;
# 允许携带Cookie
add_header Access-Control-Allow-Credentials true;
# 处理OPTIONS预检请求,直接返回204,无需转发给后端
if ($request_method = OPTIONS) {
return 204;
}
# 反向代理配置
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
6.3 限流配置(防 CC 攻击,保护后端服务)
# 1. 在http块中定义限流规则
http {
# 定义限流规则,名为limit_req
# $binary_remote_addr:按客户端IP限流
# zone=limit_req:10m:共享内存区域,10m可存储约16万个IP地址
# rate=10r/s:每秒最多10个请求
limit_req_zone $binary_remote_addr zone=limit_req:10m rate=10r/s;
# 2. 在server/location块中启用限流
server {
location ^~ /api/ {
# burst=20:突发请求超过10r/s时,最多缓冲20个请求
# nodelay:缓冲的请求立即处理,不延迟
limit_req zone=limit_req burst=20 nodelay;
proxy_pass http://127.0.0.1:8080/;
}
}
}
6.4 隐藏 Nginx 版本号(安全加固)
默认情况下,Nginx 错误页面和响应头中会显示版本号,容易被黑客针对特定版本漏洞攻击,建议隐藏:
# 在http块中添加以下配置
http {
# 隐藏响应头中的版本号
server_tokens off;
}
七、常见错误排查与解决方案
表格
| 错误码 | 核心常见原因 | 解决方案 | |
|---|---|---|---|
| 403 Forbidden | 1. 站点目录 / 文件权限错误,Nginx 用户无访问权限2. index 首页文件不存在3. 配置了 deny all 访问规则4. SELinux 未关闭(CentOS 系列) | 1. 执行chown -R www-data:www-data 站点目录设置权限2. 检查 index 文件是否存在,路径是否正确3. 检查 location 块中的 deny 规则4. 关闭 SELinux |
|
| 404 Not Found | 1. root/alias 配置错误,路径拼接不符2. 请求的文件在服务器上不存在3. 单页应用路由刷新 404,未配置 try_files4. proxy_pass 路径配置错误,转发地址不存在 | 1. 检查 root/alias 配置,区分末尾 / 的区别2. 确认文件路径与请求路径一致3. 单页应用添加try_files $uri $uri/ /index.html;4. 检查 proxy_pass 转发地址是否可正常访问 |
|
| 502 Bad Gateway | 1. 后端服务未启动 / 已宕机,proxy_pass 地址无法访问2. 后端服务端口配置错误3. PHP-FPM 等服务未启动4. 后端服务端口被防火墙拦截 | 1. 检查后端服务是否正常启动,端口是否正确2. 手动 curl 代理地址,确认是否可正常访问3. 检查防火墙是否放行后端服务端口 | |
| 504 Gateway Time-out | 1. 后端服务处理超时,接口响应过慢2. Nginx 代理超时时间设置过短3. 后端服务负载过高,无法处理请求 | 1. 优化后端接口性能,减少响应时间2. 调大proxy_read_timeout超时时间3. 检查服务器 CPU / 内存负载,扩容资源 |
|
| Nginx 启动失败 | 1. 配置文件语法错误2. 80/443 端口被其他进程占用(如 Apache、httpd)3. PID 文件路径错误 / 权限不足 | 1. 执行nginx -t检查配置文件语法错误,修复后重试2. 执行 `netstat -tulpn |
grep 80` 查看端口占用,停止占用进程3. 检查 nginx.conf 中 PID 文件路径,确认权限 |
八、安全合规与生产环境最佳实践
8.1 生产环境安全加固
- 权限最小化:Nginx 运行用户使用 www-data,禁止使用 root 用户运行
- 禁止敏感目录访问:配置规则禁止访问.ht、.env、.git 等敏感文件 / 目录
- 隐藏版本号:关闭 server_tokens,隐藏 Nginx 版本信息
- 防火墙配置:只开放必要端口,禁止不必要的端口对外暴露
- 定期更新:定期更新 Nginx 和系统组件,修复安全漏洞
- 禁用不必要的 HTTP 方法:禁用 TRACE、DELETE 等不必要的请求方法,防止攻击
- 配置 WAF 防护:可安装 Nginx WAF 模块,防 SQL 注入、XSS 攻击
8.2 法律合规提示
- 遵守《中华人民共和国网络安全法》《互联网信息服务管理办法》,不得利用 Nginx 搭建违法违规网站
- 国内服务器搭建网站,必须完成 ICP 备案,未备案域名不得解析到国内服务器
- 遵守网站 robots 协议,不得通过爬虫非法获取他人数据,不得侵犯他人知识产权
- 遵守数据安全相关法律法规,不得非法收集、存储、传输用户个人信息
8.3 日常运维最佳实践
- 配置文件备份:修改配置前先备份,避免配置错误导致服务不可用
- 配置校验 :修改配置后,必须先执行
nginx -t校验语法,再重载配置 - 重载优先 :配置更新优先使用
reload重载,无中断生效,不要直接restart重启 - 日志监控:定期查看访问日志和错误日志,及时发现异常访问和服务问题
- 性能监控:监控 Nginx 运行状态、CPU / 内存占用、请求量,及时扩容优化
- 高可用架构:生产环境建议搭建 Nginx 主从集群,避免单点故障
