从零部署Nginx:Web全栈实战指南

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 在每一步的作用:

  1. 域名解析:浏览器通过 DNS 将域名解析为服务器公网 IP
  2. TCP 连接:浏览器与服务器 IP 的对应端口(默认 80/443)建立 TCP 连接
  3. 请求接收:Nginx 作为 Web 服务器,最先接收到浏览器的 HTTP/HTTPS 请求
  4. 请求处理
    • 若为静态资源请求(HTML/CSS/JS/ 图片):Nginx 直接从服务器磁盘读取文件,返回给浏览器
    • 若为动态接口请求:Nginx 通过反向代理,将请求转发给后端应用服务(Node.js/Java 等)处理
  5. 结果返回:后端处理完成后,结果经 Nginx 封装,返回给浏览器
  6. 页面渲染:浏览器接收资源,解析渲染出用户可见的页面
  7. 连接关闭:请求完成后,按配置规则关闭 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 远程连接服务器

  1. Windows 用户:推荐使用 FinalShell、Xshell、Windows Terminal 自带的 SSH

  2. Mac/Linux 用户:直接使用系统终端自带的 SSH

  3. 连接命令 (终端执行):

    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 安装成功验证

  1. 启动 Nginx:systemctl start nginx
  2. 设置开机自启:systemctl enable nginx
  3. 打开浏览器,输入服务器公网 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 配置文件核心语法规则

  1. 配置文件由指令指令参数 组成,以分号;结尾,缺一不可(新手高频报错点)
  2. 配置块用大括号{}包裹,支持嵌套,层级分明
  3. 注释用#开头,单行注释,不生效
  4. 配置文件大小写敏感
  5. 同一层级的指令,后面的会覆盖前面的
  6. 修改配置后,必须执行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 匹配优先级从高到低排序:

  1. 精确匹配 =:完全匹配路径,优先级最高

    复制代码
    # 仅匹配 http://yourdomain.com/login
    location = /login {
        # 配置
    }
  2. 前缀匹配 ^~:匹配路径开头,匹配成功后不再匹配正则

    复制代码
    # 匹配所有以/static/开头的路径,如/static/css/style.css
    location ^~ /static/ {
        # 配置
    }
  3. 正则匹配 ~(区分大小写)/ ~*(不区分大小写):匹配正则表达式

    复制代码
    # 匹配所有以.php结尾的路径,不区分大小写
    location ~* \.php$ {
        # 配置
    }
  4. 普通前缀匹配:无修饰符,匹配路径开头,优先级低于正则

  5. 通用匹配 /:匹配所有请求,优先级最低

新手高频踩坑: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 站点配置最佳实践(生产环境必遵守)

  1. 分站点管理 :不要把所有站点配置都写在 nginx.conf 主配置文件中,每个站点单独创建一个配置文件,放在/etc/nginx/sites-available/目录下

  2. 软链接生效 :需要生效的站点,创建软链接到/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
  3. 配置文件命名 :用域名命名配置文件,如yourdomain.com.conf,方便管理

  4. 权限配置 :站点目录权限设置为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:访问验证
  1. 有域名:将域名解析到服务器公网 IP,浏览器输入域名即可访问
  2. 无域名:浏览器直接输入服务器公网 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
验证
  1. 确保后端服务已启动,运行在 127.0.0.1:8080
  2. 浏览器输入域名,可正常访问前端页面
  3. 前端接口请求可正常转发到后端,无跨域问题

场景 3:HTTPS 证书配置(生产环境必做,全站 HTTPS)

HTTPS 通过 SSL/TLS 加密传输,防止数据被窃听、篡改,是生产环境的必备配置,主流浏览器已将 HTTP 站点标记为不安全。

前提条件
  1. 已拥有域名,并已解析到服务器公网 IP
  2. 服务器已开放 443 端口(HTTPS 默认端口)
  3. 已申请 SSL 证书(分为免费证书和付费证书)
步骤 1:申请 SSL 证书

推荐两种方式,新手推荐第一种:

  1. 云厂商免费证书:阿里云 / 腾讯云 / 华为云均可申请免费单域名 SSL 证书,有效期 1 年,操作简单,一键下载证书文件
  2. 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
验证
  1. 浏览器输入http://你的域名,会自动跳转到https://你的域名
  2. 浏览器地址栏出现小锁图标,说明 HTTPS 配置成功
  3. 可通过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 生产环境安全加固

  1. 权限最小化:Nginx 运行用户使用 www-data,禁止使用 root 用户运行
  2. 禁止敏感目录访问配置规则禁止访问.ht、.env、.git 等敏感文件 / 目录
  3. 隐藏版本号:关闭 server_tokens,隐藏 Nginx 版本信息
  4. 防火墙配置:只开放必要端口,禁止不必要的端口对外暴露
  5. 定期更新:定期更新 Nginx 和系统组件,修复安全漏洞
  6. 禁用不必要的 HTTP 方法:禁用 TRACE、DELETE 等不必要的请求方法,防止攻击
  7. 配置 WAF 防护:可安装 Nginx WAF 模块,防 SQL 注入、XSS 攻击

8.2 法律合规提示

  1. 遵守《中华人民共和国网络安全法》《互联网信息服务管理办法》,不得利用 Nginx 搭建违法违规网站
  2. 国内服务器搭建网站,必须完成 ICP 备案,未备案域名不得解析到国内服务器
  3. 遵守网站 robots 协议,不得通过爬虫非法获取他人数据,不得侵犯他人知识产权
  4. 遵守数据安全相关法律法规,不得非法收集、存储、传输用户个人信息

8.3 日常运维最佳实践

  1. 配置文件备份:修改配置前先备份,避免配置错误导致服务不可用
  2. 配置校验 :修改配置后,必须先执行nginx -t校验语法,再重载配置
  3. 重载优先 :配置更新优先使用reload重载,无中断生效,不要直接restart重启
  4. 日志监控:定期查看访问日志和错误日志,及时发现异常访问和服务问题
  5. 性能监控:监控 Nginx 运行状态、CPU / 内存占用、请求量,及时扩容优化
  6. 高可用架构:生产环境建议搭建 Nginx 主从集群,避免单点故障
相关推荐
乾元2 小时前
本地大模型:如何在内网部署 Llama/Qwen 等安全增强模型
运维·网络·人工智能·安全·机器学习·llama·安全架构
流水迢迢lst2 小时前
Linux概述及基础命令
linux·运维·服务器
醇氧2 小时前
Window 查看是否安装wsl
linux·运维·服务器
cyw89982 小时前
docker 安装 ollama 并运行
运维·docker·容器
进击切图仔2 小时前
docker compose 的简单使用
运维·docker·容器
-SOLO-2 小时前
chrome插件 将网页转化为markdown
前端·chrome
ljh5746491192 小时前
chomd 命令的解释和常用用法和高级用法
linux·运维·服务器
酉鬼女又兒2 小时前
零基础入门Web应用开发(备赛蓝桥杯)_网页布局原理
前端·职场和发展·蓝桥杯·html5
Johnstons2 小时前
当网络运维遇上全流量回溯:一次关于「看得见」的实践
运维·网络