从零开始: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)是最好的学习资料,建议结合实际场景多动手实践,才能真正掌握这一强大的工具。

相关推荐
码农101号41 分钟前
Linux - redis下载以及基础使用
linux·运维·redis
闲人编程41 分钟前
TCP/UDP网络编程实战
服务器·网络·tcp/ip·udp·客户端·codecapsule
linux修理工44 分钟前
vagrant ansible 配置
linux·运维·服务器·数据库·centos
忆林52044 分钟前
关于微服务多链路调用405(客户端通过nginx请求后端A,A通过调用B的nginx请求B的后端)
服务器·nginx·微服务
绯雨千叶44 分钟前
修改Docker镜像和容器的默认存储目录(迁移原有数据)
运维·docker·容器
RisunJan1 小时前
Linux命令-free命令(查看系统内存(RAM)和交换空间(Swap)使用情况)
linux·运维·服务器
linux修理工1 小时前
vagrant file 设置固定IP并允许密码登录
java·linux·服务器
似水流年 光阴已逝1 小时前
拒绝“失联”:Linux 云服务器无法登录的全链路排查手册
linux·运维·服务器
脏脏a2 小时前
【Linux】进程优先级:谁先 “上车” 谁说了算?
linux·运维·服务器