从零开始:Nginx 服务器安装、配置与实战使用完全指南

从零开始:Nginx 服务器安装、配置与实战使用完全指南

在现代 Web 服务架构中,Nginx 凭借其高性能、高并发、低资源消耗的特性,成为了全球最受欢迎的 Web 服务器之一,同时还能承担反向代理、负载均衡、动静分离等核心角色。无论是搭建个人网站、企业级应用,还是构建微服务架构,Nginx 都是不可或缺的工具。本文将从环境准备到实战场景,带你一步步掌握 Nginx 的安装、核心配置与实际应用,即使是 Linux 新手也能轻松上手。

一、环境准备:明确前提与工具

在开始安装前,需确认你的环境满足以下条件,避免后续操作出现兼容性问题:

  1. 操作系统 :主流 Linux 发行版(本文以 Ubuntu 22.04 LTSCentOS Stream 9 为例,覆盖 Debian 系与 RHEL 系两大阵营,Windows/macOS 可参考思路,但生产环境建议使用 Linux);
  2. 权限要求 :拥有 sudo 管理员权限(所有安装、配置命令需管理员权限执行);
  3. 网络环境:服务器可正常联网(用于通过包管理器或官方源下载 Nginx 软件包);
  4. 工具准备:终端(本地终端或远程 SSH 连接,如 Xshell、FinalShell、iTerm2);
  5. 端口检查 :确保 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 安装成功

无论哪种系统,安装完成后可通过两种方式验证:

  1. 终端命令验证 :执行 nginx -v,输出类似 nginx version: nginx/1.24.0,说明版本正确;
  2. 浏览器访问验证 :在本地浏览器输入服务器 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.comwww.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:测试动静分离
  1. /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
  2. 浏览器访问:

    • 静态资源: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

按提示操作:

  1. 输入邮箱(用于证书到期提醒);
  2. 同意服务条款(输入 A);
  3. 是否共享邮箱(可选,输入 N);
  4. 是否将 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)」为例:

  1. 编辑 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)
        }
    }
  2. 启动 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'));
  3. 浏览器访问 https://www.site1.com/api/hello,可看到 Node.js 返回的 JSON 数据,说明反向代理生效。

4.2 场景 2:负载均衡(分摊高并发压力)

当后端服务压力过大(如秒杀、高并发访问)时,可通过 Nginx 负载均衡将请求分发到多台后端服务器,避免单点故障,提升服务可用性。

以「3 台 Tomcat 服务器(192.168.1.101:8080192.168.1.102:8080192.168.1.103:8080)实现负载均衡」为例:

  1. 编辑 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;
        }
    }
  2. 测试负载均衡:在每台 Tomcat 的 webapps/ROOT/index.html 中添加不同标识(如 Server 101Server 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);
  • 解决方案
    1. 查找占用端口的进程:sudo lsof -i :80sudo netstat -tulpn | grep :80
    2. 停止占用进程:sudo systemctl stop apache2(或对应服务名);
    3. 若需保留其他服务,可修改 Nginx 监听端口(如将 listen 80 改为 listen 8080,访问时需加端口:http://服务器IP:8080)。

5.2 问题 2:访问 PHP 页面显示源码,不执行

  • 原因:Nginx 未配置 PHP 转发规则,直接将 PHP 文件作为静态资源返回;
  • 解决方案
    1. 确认已安装 PHP-FPM 并启动;
    2. 在 Nginx 配置中添加 location ~ \.php$ 块(参考 3.4 节动静分离配置);
    3. 检查 fastcgi_pass 路径是否正确(默认路径为 /run/php/php-fpm.sock)。

5.3 问题 3:HTTPS 访问提示「证书无效」

  • 原因:域名解析未生效、证书文件路径错误、证书已过期;
  • 解决方案
    1. 验证域名解析:ping www.site1.com 确认解析到正确 IP;
    2. 检查证书路径:查看 Nginx 配置中 ssl_certificatessl_certificate_key 路径是否正确(默认在 /etc/letsencrypt/live/域名/ 下);
    3. 续期证书:若证书过期,执行 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-IPX-Forwarded-For 头获取真实 IP(如 Java 用 request.getHeader("X-Real-IP"))。

六、总结与进阶学习

本文从「安装→配置→实战」三个维度,覆盖了 Nginx 的核心知识点:

  1. 安装:通过官方源安装最新稳定版,避免版本过旧导致的安全风险;
  2. 配置:掌握虚拟主机、动静分离、HTTPS 等基础配置,满足多场景需求;
  3. 实战:通过反向代理、负载均衡、日志分析,解决实际项目中的高并发、高可用问题。

若想进一步深入 Nginx,可学习以下进阶内容:

  • Nginx 性能优化 :调整 worker_processes(建议等于 CPU 核心数)、worker_connections(单进程最大连接数)、缓存策略等;
  • Nginx 高可用:通过 Keepalived 实现 Nginx 主从切换,避免单点故障;
  • Nginx 插件开发:基于 Lua 脚本(OpenResty)扩展 Nginx 功能(如限流、鉴权)。

Nginx 的官方文档(Nginx Official Documentation)是最好的学习资料,建议结合实际场景多动手实践,才能真正掌握这一强大的工具。

相关推荐
ping某19 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈3 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造