Linux运维工程师Nginx系统学习体系

一、前提知识准备(必学!否则后续配置看不懂)

Nginx 跑在 Linux 上,且依赖网络协议,先掌握以下基础,避免 “卡壳”:

1. Linux 系统基础(核心命令)

必备命令:
cd/pwd/ls
(目录操作)、
yum/apt
(包管理)、
systemctl
(服务管理)、
vim
(编辑配置文件)、
netstat/ss
(查看端口)、
ps/top
(进程管理)、
tar/gzip
(压缩解压)、
chmod/chown
(权限管理)解释:比如
systemctl start nginx
启动服务,
ss -tuln | grep 80
查看 80 端口是否占用,这些是后续操作的 “基本功”。

2. 网络基础(核心协议)

必备概念:
HTTP 协议:请求方法(GET/POST)、状态码(200/404/502)、请求头(Host/Referer/User-Agent)、响应头TCP/IP:端口(80/443)、IP 地址(公网 / 内网)、Socket 连接HTTPS:SSL/TLS 加密原理(非对称加密 + 对称加密)、证书作用(验证身份 + 加密数据) 解释:比如 Nginx 配置 “反向代理” 时,需要理解 “客户端→Nginx(代理)→后端服务” 的 TCP 连接流程;配置 HTTPS 时,要知道证书是给浏览器验证服务器身份用的。

二、Nginx 环境搭建(先让 Nginx 跑起来)

目标:掌握两种安装方式(工作中都用),并理解 “安装路径、服务管理、版本查看”。

1. 方式 1:包管理器安装(快速部署,适合测试 / 简单场景)

实验环境

系统:CentOS 7(或 Ubuntu 20.04,命令略有差异)前提:Linux 能联网

实验步骤(CentOS 7 为例)

配置 Nginx 官方源(默认 yum 源的 Nginx 版本较旧,官方源更新):

bash



# 创建源文件
vim /etc/yum.repos.d/nginx.repo
# 粘贴以下内容(官方源配置)
[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

bash



yum clean all && yum makecache  # 清理缓存,加载新源
yum install -y nginx            # 安装(-y表示自动确认)

验证安装 & 启动服务

bash



nginx -v  # 查看版本(如显示nginx/1.24.0,说明安装成功)
systemctl start nginx           # 启动服务
systemctl enable nginx          # 设置开机自启(避免重启后服务消失)
systemctl status nginx          # 查看服务状态(显示active(running)为正常)

测试访问
关闭防火墙(测试环境,生产环境需放通端口):
systemctl stop firewalld
浏览器输入 Linux 的 IP 地址(如http://192.168.1.100),能看到 Nginx 默认欢迎页(“Welcome to nginx!”),说明服务正常。

关键路径(记下来!后续改配置用)

主配置文件:
/etc/nginx/nginx.conf
默认站点配置:
/etc/nginx/conf.d/default.conf
日志文件:
/var/log/nginx/
(access.log 访问日志,error.log 错误日志)网页根目录:
/usr/share/nginx/html/
(默认欢迎页在这里)

2. 方式 2:源码编译安装(自定义模块,生产环境常用)

实验目的

包管理器安装的 Nginx 默认只包含基础模块,若需要 “SSL 模块、缓存模块” 等,需源码编译时手动启用。

实验步骤(CentOS 7 为例)

安装依赖包(编译 Nginx 需要的工具和库):

bash



yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
# 解释:
# gcc/gcc-c++:编译C语言代码的工具
# pcre-devel:支持正则表达式(Nginx的location匹配需要)
# zlib-devel:支持gzip压缩(静态资源优化需要)
# openssl-devel:支持SSL(HTTPS需要)

下载 Nginx 源码包(去官网找最新稳定版,这里以 1.24.0 为例):

bash



cd /usr/local/src  # 源码包统一放在这里
wget https://nginx.org/download/nginx-1.24.0.tar.gz  # 下载
tar -zxvf nginx-1.24.0.tar.gz  # 解压
cd nginx-1.24.0  # 进入解压后的目录

配置编译参数(核心!指定安装路径 + 启用模块):

bash



./configure 
--prefix=/usr/local/nginx   # 安装路径(自定义,推荐这里)
--user=nginx                # 运行Nginx的用户(避免用root,安全)
--group=nginx               # 运行Nginx的用户组
--with-http_ssl_module      # 启用SSL模块(支持HTTPS)
--with-http_stub_status_module   # 启用状态模块(查看Nginx运行状态)
--with-http_gzip_static_module  # 启用gzip静态压缩模块

执行后若没报错,会生成 Makefile 文件(下一步编译用)。 编译 & 安装

bash



make  # 编译(将源码转成可执行文件)
make install  # 安装(将文件复制到--prefix指定的路径)

创建 Nginx 用户 & 配置服务管理(源码安装没有 systemctl 服务,需手动配置):

bash



useradd -r -m -s /sbin/nologin nginx  # 创建nginx用户(-r表示系统用户,无登录权限)
# 创建systemctl服务文件
vim /usr/lib/systemd/system/nginx.service
# 粘贴以下内容
[Unit]
Description=The Nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid  # PID文件路径(在安装路径下)
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf  # 启动前检查配置
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  # 启动命令
ExecReload=/bin/kill -s HUP $MAINPID  # 重载配置(不重启服务)
ExecStop=/bin/kill -s QUIT $MAINPID  # 停止命令
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

启动 & 验证

bash



systemctl daemon-reload  # 重新加载服务配置
systemctl start nginx
systemctl enable nginx
/usr/local/nginx/sbin/nginx -v  # 查看版本
# 浏览器访问IP,能看到欢迎页即成功
关键路径(源码安装和包管理器路径不同,别混!)

主配置文件:
/usr/local/nginx/conf/nginx.conf
启动命令:
/usr/local/nginx/sbin/nginx
日志文件:
/usr/local/nginx/logs/
网页根目录:
/usr/local/nginx/html/

三、Nginx 基础配置(理解配置文件结构,核心中的核心)

目标:搞懂
nginx.conf
的 “层级结构”,掌握 “基础参数”,能修改默认站点。

1. 配置文件结构(3 层核心:main→http→server/location)

先打开主配置文件(以包管理器安装为例,路径
/etc/nginx/nginx.conf
),结构如下(# 开头是注释):

nginx



# 1. main层:全局配置(对整个Nginx生效)
worker_processes  1;  # 工作进程数(关键参数)
error_log  /var/log/nginx/error.log warn;  # 错误日志路径+级别
pid        /var/run/nginx.pid;  # PID文件路径
 
# 2. events层:事件模型配置(影响Nginx的并发能力)
events {
    worker_connections  1024;  # 每个工作进程的最大连接数(关键参数)
    use epoll;  # 启用epoll事件模型(Linux下最优,异步非阻塞)
}
 
# 3. http层:HTTP协议相关配置(所有站点共享)
http {
    include       /etc/nginx/mime.types;  # 映射文件类型(如.html→text/html)
    default_type  application/octet-stream;  # 默认文件类型
 
    # 日志格式配置(自定义访问日志的内容)
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;  # 访问日志路径+使用main格式
 
    sendfile        on;  # 启用零拷贝(加速静态资源传输,必开)
    keepalive_timeout  65;  # 长连接超时时间(单位:秒)
 
    # 4. server层:虚拟主机配置(一个server对应一个站点)
    server {
        listen       80;  # 监听端口(HTTP默认80)
        server_name  localhost;  # 站点域名(如www.xxx.com)
 
        # 5. location层:URL路径匹配(对指定路径做特殊处理)
        location / {
            root   /usr/share/nginx/html;  # 站点根目录(文件存放路径)
            index  index.html index.htm;  # 默认首页(访问/时优先找这两个文件)
        }
 
        # 错误页面配置(404时跳转到404.html)
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
 
    include /etc/nginx/conf.d/*.conf;  # 引入其他站点配置(推荐把站点放这里,不混在main里)
}
核心层级关系(记死!)


main
:最外层,全局生效(如工作进程数)
events
:嵌套在 main 里,控制网络连接(如并发数)
http
:嵌套在 main 里,所有 HTTP 服务的公共配置(如日志格式、压缩)
server
:嵌套在 http 里,一个 server 就是一个 “网站”(如www.xxx.com和blog.xxx.com是两个 server)
location
:嵌套在 server 里,匹配 URL 路径(如访问 /www/ 和 /blog/ 是两个 location)

2. 基础配置实验:修改默认站点(从 “欢迎页” 到 “自定义页面”)

实验目标

把 Nginx 默认的 “Welcome to nginx!” 页面,改成自己写的 HTML 页面,理解
root

index
参数的作用。

实验步骤

创建自定义 HTML 页面

bash



# 包管理器安装的根目录是/usr/share/nginx/html,先备份默认首页
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
# 新建自定义首页
vim /usr/share/nginx/html/index.html
# 粘贴以下内容(简单的HTML)
<!DOCTYPE html>
<html>
<head>
    <title>我的第一个Nginx站点</title>
    <meta charset="utf-8">
</head>
<body>
    <h1>Hello Nginx!</h1>
    <p>这是我自己配置的站点~</p>
</body>
</html>

检查配置文件语法(必做!避免配置错误导致服务启动失败)

bash



nginx -t  # 包管理器安装用这个;源码安装用/usr/local/nginx/sbin/nginx -t
# 若显示“nginx: configuration file /etc/nginx/nginx.conf test is successful”,说明语法没问题

重载配置(不重启服务,平滑生效,生产环境推荐)

bash


systemctl reload nginx  # 或 nginx -s reload(源码安装用/usr/local/nginx/sbin/nginx -s reload)

测试访问
浏览器输入 Linux 的 IP,能看到 “Hello Nginx!” 和红色标题,说明配置生效。若想测试
index
参数:在根目录新建
index.htm
(内容和 index.html 不同),删除 index.html 后刷新浏览器,会显示 index.htm 的内容(因为
index
参数是按顺序找的)。

3. 基础配置实验:调整并发能力(修改 worker_processes 和 worker_connections)

实验目标

理解 “工作进程数” 和 “每个进程最大连接数” 如何影响 Nginx 的并发能力,学会根据 CPU 核心数优化。

知识点解释


worker_processes
:工作进程数,推荐设置为 CPU 核心数(比如 4 核 CPU 设为 4),因为每个进程是单线程,绑定一个 CPU 核心能减少切换开销。
worker_connections
:每个工作进程的最大连接数(默认 1024),Nginx 的理论最大并发数 = worker_processes × worker_connections(但实际受限于系统打开文件数)。

实验步骤

查看 CPU 核心数

bash


lscpu | grep "CPU(s):" | head -1  # 输出如“CPU(s):                2”,说明2核

修改 main 层和 events 层配置

bash



vim /etc/nginx/nginx.conf
# 修改以下参数(假设CPU是2核)
worker_processes  2;  # 设为CPU核心数
events {
    worker_connections  2048;  # 改为2048(根据需求调整,别太大)
    use epoll;  # 加上这行,启用epoll模型
}

调整系统打开文件数限制(避免并发时 “too many open files” 错误)

bash



# 临时生效(重启后失效)
ulimit -n 65535
# 永久生效(修改配置文件)
vim /etc/security/limits.conf
# 末尾添加以下两行
* soft nofile 65535  # 软限制(警告阈值)
* hard nofile 65535  # 硬限制(最大限制)
# 重启Linux后生效(或重新登录终端)

验证配置 & 测试并发
重载配置:
systemctl reload nginx

ab工具
测试并发(先安装 ab:
yum install -y httpd-tools
):

bash



ab -n 1000 -c 200 http://localhost/  # -n总请求数,-c并发数
# 输出中“Requests per second:  xxx.xx [#/sec] (mean)”是QPS(每秒请求数),数值越高越好

四、Nginx 核心功能(工作中最常用的 4 大场景)

这部分是 “运维刚需”,必须熟练掌握,每个功能都配实战实验。

场景 1:静态资源服务(Nginx 的 “老本行”,比 Apache 快)

Nginx 天生适合处理静态资源(HTML/CSS/JS/ 图片 / 视频),因为它是 “异步非阻塞” 模型,资源加载快。

知识点解释

关键参数:

root /path
:指定静态资源的根目录(如
root /data/static
,则访问
/img/1.jpg
对应
/data/static/img/1.jpg

alias /path
:给路径起别名(和 root 的区别:
location /img/ { alias /data/img/; }
,访问
/img/1.jpg
对应
/data/img/1.jpg
,而 root 会多拼接
/img/

expires 30d
:设置浏览器缓存(静态资源 30 天内不重新下载,减少请求)
gzip on
:启用 gzip 压缩(缩小文件体积,加速传输)

实验:搭建静态资源服务器(存放图片和 CSS)

创建静态资源目录 & 上传文件

bash



mkdir -p /data/static/img  # 图片目录
mkdir -p /data/static/css  # CSS目录
# 上传一张图片到/img目录(比如用rz命令,或wget下载一张)
wget https://nginx.org/nginx.png -O /data/static/img/nginx.png
# 新建CSS文件
vim /data/static/css/style.css
# 粘贴内容
h1 { color: blue; font-size: 24px; }
p { color: green; }

创建站点配置文件(推荐单独放 conf.d 目录,不混 main 配置)

bash



vim /etc/nginx/conf.d/static.conf  # 新建静态站点配置
# 粘贴以下内容
server {
    listen 80;
    server_name static.test.com;  # 自定义域名(测试用,后续改hosts)
 
    # 配置图片路径(用alias)
    location /img/ {
        alias /data/static/img/;  # 访问/static/img/xxx对应/data/static/img/xxx
        expires 7d;  # 图片缓存7天
        autoindex on;  # 开启目录索引(访问/img/时显示目录下的文件,方便测试)
    }
 
    # 配置CSS路径(用root)
    location /css/ {
        root /data/static/;  # 访问/css/xxx对应/data/static/css/xxx
        expires 30d;  # CSS缓存30天
    }
 
    # 配置首页(引用图片和CSS)
    location / {
        root /data/static;
        index index.html;
        gzip on;  # 启用gzip压缩
        gzip_types text/html text/css image/png;  # 对HTML/CSS/PNG进行压缩
    }
}

创建首页(引用静态资源)

bash



vim /data/static/index.html
# 粘贴内容
<!DOCTYPE html>
<html>
<head>
    <title>静态资源站点</title>
    <link rel="stylesheet" href="/css/style.css">  # 引用CSS
</head>
<body>
    <h1>静态资源测试</h1>
    <p>这是用CSS样式的文字~</p>
    <img src="/img/nginx.png" alt="Nginx图片">  # 引用图片
</body>
</html>

配置本地 hosts(让浏览器识别static.test.com域名)
Windows:打开
C:WindowsSystem32driversetchosts
,添加一行:
Linux的IP static.test.com
(如
192.168.1.100 static.test.com
)Mac/Linux:打开
/etc/hosts
,添加同上内容 测试访问
浏览器输入
http://static.test.com
:能看到蓝色标题、绿色文字和 Nginx 图片,说明静态资源加载正常。访问
http://static.test.com/img/
:能看到目录下的 nginx.png 文件,说明 autoindex 生效。查看网络请求(浏览器按 F12→Network):CSS 和图片的 “Size” 列会显示 “from disk cache”(缓存生效),“Content-Encoding” 列显示 “gzip”(压缩生效)。

场景 2:虚拟主机(一个 Nginx 跑多个网站)

工作中不会一台服务器只跑一个网站,虚拟主机能实现 “一个 Nginx 监听 80 端口,根据域名访问不同网站”。

三种虚拟主机类型
类型 原理 适用场景
基于域名 不同域名(如www.xxx.com和blog.xxx.com)对应不同 server 最常用(多网站共用 80/443)
基于端口 同一域名不同端口(如www.xxx.com:80和www.xxx.com:8080) 测试环境(避免域名冲突)
基于 IP 不同 IP 对应不同 server(需服务器多 IP) 特殊场景(如需要独立 IP)
实验:配置 2 个基于域名的虚拟主机(www.test1.com和www.test2.com)

创建两个网站的根目录和首页

bash



# 网站1:www.test1.com
mkdir -p /data/www/test1
vim /data/www/test1/index.html
# 内容:<h1>这是test1网站!</h1>
 
# 网站2:www.test2.com
mkdir -p /data/www/test2
vim /data/www/test2/index.html
# 内容:<h1>这是test2网站!</h1>

创建两个虚拟主机的配置文件

bash



# 网站1配置
vim /etc/nginx/conf.d/test1.conf
server {
    listen 80;
    server_name www.test1.com;  # 域名1
 
    location / {
        root /data/www/test1;
        index index.html;
    }
}
 
# 网站2配置
vim /etc/nginx/conf.d/test2.conf
server {
    listen 80;
    server_name www.test2.com;  # 域名2
 
    location / {
        root /data/www/test2;
        index index.html;
    }
}

配置本地 hosts
打开 hosts 文件,添加两行:

plaintext



192.168.1.100  www.test1.com
192.168.1.100  www.test2.com

测试访问
浏览器输入
http://www.test1.com
:显示 “这是 test1 网站!”浏览器输入
http://www.test2.com
:显示 “这是 test2 网站!”原理:浏览器请求时会携带
Host
头(如 Host: www.test1.com),Nginx 根据
server_name
匹配对应的 server 块。

场景 3:反向代理(Nginx 作为 “中间人”,转发请求到后端服务)

反向代理是 Nginx 的 “核心功能”,比如:用户访问
http://www.xxx.com
(Nginx),Nginx 偷偷把请求转发到后端的 Tomcat/Node.js/Java 服务(如
http://127.0.0.1:8080
),用户看不到后端服务,安全性高。

知识点解释

关键参数:

proxy_pass http://后端服务地址
:核心!指定后端服务的 IP: 端口(如
proxy_pass http://127.0.0.1:8080

proxy_set_header Host $host
:传递客户端的 Host 头(后端服务需要知道用户访问的域名)
proxy_set_header X-Real-IP $remote_addr
:传递客户端真实 IP(否则后端看到的 IP 是 Nginx 的 IP)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
:传递代理链 IP(多代理场景)

实验:用 Nginx 反向代理 Tomcat 服务(模拟后端 Java 服务)

先安装 Tomcat(后端服务)

bash



# 安装Java(Tomcat需要JDK)
yum install -y java-1.8.0-openjdk-devel
# 下载Tomcat 9
cd /usr/local/src
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz
tar -zxvf apache-tomcat-9.0.85.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-9.0.85 /usr/local/tomcat
# 启动Tomcat(默认监听8080端口)
/usr/local/tomcat/bin/startup.sh
# 测试Tomcat:浏览器输入http://LinuxIP:8080,能看到Tomcat默认页,说明后端服务正常

配置 Nginx 反向代理

bash



vim /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name proxy.test.com;  # 代理域名
 
    location / {
        # 核心:转发到Tomcat的8080端口
        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_connect_timeout 30s;
        proxy_read_timeout 60s;
    }
}

配置 hosts
添加
192.168.1.100 proxy.test.com
测试代理效果
浏览器输入
http://proxy.test.com
(没有加 8080 端口),能看到 Tomcat 默认页,说明代理成功。验证真实 IP 传递:在 Tomcat 的日志文件(
/usr/local/tomcat/logs/localhost_access_log.2024-xx-xx.txt
)中,能看到客户端的真实 IP(如 192.168.1.1),而不是 127.0.0.1(Nginx 的 IP),说明
X-Real-IP
生效。

场景 4:负载均衡(多后端服务分摊压力,避免单点故障)

当后端服务(如 Tomcat)访问量太大时,单台服务器扛不住,负载均衡能把请求 “均匀分配” 到多台后端服务器,同时实现 “故障自动剔除”(某台后端挂了,Nginx 不转发请求给它)。

知识点解释

核心模块:
upstream
(定义后端服务器组)常用调度算法(默认轮询):

算法 原理 适用场景
轮询(默认) 按顺序依次转发给后端服务器 后端服务性能一致时
权重(weight) 权重越高,接收的请求越多(如
server 192.168.1.101 weight=5
后端性能不一致(高配权重高)
ip_hash 同一客户端 IP 始终转发给同一后端服务器 需要会话保持(如登录状态)
fair 按后端服务器的响应时间分配(响应快的多接) 追求性能最优

健康检查:Nginx 默认是 “被动健康检查”(后端挂了,Nginx 尝试几次失败后,暂时不转发),参数:

max_fails=3
:允许请求失败的最大次数(默认 1)
fail_timeout=30s
:失败后,30 秒内不再转发请求给该后端(默认 10 秒)

实验:配置负载均衡(2 台 Tomcat 后端,权重 + 健康检查)

准备 2 台后端 Tomcat(或在同一台服务器启动 2 个 Tomcat,改端口)
这里简化:同一台服务器启动 2 个 Tomcat,端口分别为 8080 和 8081。

bash



# 复制Tomcat目录,改端口(8080→8081)
cp -r /usr/local/tomcat /usr/local/tomcat2
# 修改Tomcat2的端口(避免冲突)
vim /usr/local/tomcat2/conf/server.xml
# 改3个端口:
# 1. <Server port="8005" shutdown="SHUTDOWN"> → 8006
# 2. <Connector port="8080" protocol="HTTP/1.1"> → 8081
# 3. <Connector port="8009" protocol="AJP/1.3"> → 8010
# 启动Tomcat2
/usr/local/tomcat2/bin/startup.sh
# 测试:访问http://LinuxIP:8080和http://LinuxIP:8081,都能看到Tomcat页

修改 Tomcat 首页(区分两个后端,方便测试)

bash



# Tomcat1(8080)首页加标记
vim /usr/local/tomcat/webapps/ROOT/index.jsp
# 在<body>里加一行:<h2>后端服务器:8080</h2>
 
# Tomcat2(8081)首页加标记
vim /usr/local/tomcat2/webapps/ROOT/index.jsp
# 在<body>里加一行:<h2>后端服务器:8081</h2>

配置 Nginx 负载均衡

bash



vim /etc/nginx/conf.d/loadbalance.conf
# 1. 定义后端服务器组(upstream块必须在http层里)
upstream tomcat_servers {
    server 127.0.0.1:8080 weight=2 max_fails=3 fail_timeout=30s;  # 权重2,健康检查
    server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;  # 权重1
    # 解释:权重2:1,意味着8080接收2/3的请求,8081接收1/3
}
 
# 2. 配置server块,转发到服务器组
server {
    listen 80;
    server_name lb.test.com;  # 负载均衡域名
 
    location / {
        proxy_pass http://tomcat_servers;  # 这里填upstream的名字,不是具体IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

配置 hosts
添加
192.168.1.100 lb.test.com
测试负载均衡效果
浏览器输入
http://lb.test.com
,反复刷新页面:
大部分时候显示 “后端服务器:8080”(权重 2),偶尔显示 “后端服务器:8081”(权重 1),说明轮询 + 权重生效。 测试故障自动剔除:
停止 Tomcat1:
/usr/local/tomcat/bin/shutdown.sh
刷新浏览器,此时所有请求都转发到 8081(只显示 8081),说明 Nginx 剔除了故障的 8080。重启 Tomcat1:
/usr/local/tomcat/bin/startup.sh
,30 秒后刷新,8080 又会重新接收请求(fail_timeout=30s 生效)。

五、HTTPS 配置(让网站更安全,现在是标配)

HTTP 是明文传输,数据容易被窃取;HTTPS 是 “HTTP+SSL/TLS”,数据加密传输,且需要证书验证服务器身份。

知识点解释

证书类型:
免费证书:Let's Encrypt(有效期 3 个月,可自动续期),适合个人 / 中小企业。付费证书:Symantec/GeoTrust(有效期 1-2 年,带企业验证,适合大型网站)。 Nginx HTTPS 关键参数:

listen 443 ssl
:监听 443 端口(HTTPS 默认端口)
ssl_certificate /path/xxx.pem
:证书公钥路径
ssl_certificate_key /path/xxx.key
:证书私钥路径
ssl_protocols TLSv1.2 TLSv1.3
:启用安全的 TLS 版本(禁用 SSLv2/SSLv3,有漏洞)
ssl_prefer_server_ciphers on
:优先使用服务器的加密套件(更安全)

实验:用 Let's Encrypt 免费证书配置 HTTPS(自动续期)

安装 certbot 工具(Let's Encrypt 官方推荐,自动申请 + 续期证书)

bash



# CentOS 7安装certbot
yum install -y epel-release
yum install -y certbot python2-certbot-nginx  # python2-certbot-nginx:自动修改Nginx配置

申请证书(自动验证域名 + 配置 Nginx)

bash



# 前提:域名必须能被公网访问(测试环境若没有公网域名,可跳过,用自签证书)
# 命令格式:certbot --nginx -d 域名
certbot --nginx -d www.yourdomain.com  # 替换成你的真实域名(如www.test.com)

执行后按提示操作:
输入邮箱(用于证书到期提醒)同意协议(A)是否共享邮箱(N)是否强制 HTTPS(选择 2,Redirect,自动把 HTTP 请求跳转到 HTTPS) 验证 HTTPS 配置
certbot 会自动修改 Nginx 配置,添加 HTTPS 相关参数,比如:

nginx



server {
    listen 443 ssl;
    server_name www.yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    # 其他配置...
}
# 自动添加HTTP跳转HTTPS的server块
server {
    listen 80;
    server_name www.yourdomain.com;
    return 301 https://$host$request_uri;  # 301永久重定向到HTTPS
}

测试访问
浏览器输入
http://www.yourdomain.com
,会自动跳转到
https://www.yourdomain.com
,地址栏显示 “小绿锁”,说明 HTTPS 生效。点击小绿锁→“证书”,能看到 Let's Encrypt 的证书信息,有效期 3 个月。 配置自动续期(避免证书过期)
Let's Encrypt 证书有效期 3 个月,用 crontab 定时任务自动续期:

bash



# 编辑定时任务
crontab -e
# 添加一行(每天凌晨2点执行续期,续期后重载Nginx)
0 2 * * * certbot renew --quiet && systemctl reload nginx
# --quiet:静默执行,不输出日志

六、Nginx 日志管理(排障全靠它)

Nginx 日志分为 “访问日志(access.log)” 和 “错误日志(error.log)”,工作中排查问题(如 404/502 错误)必须看日志。

1. 日志配置(自定义日志内容)

知识点解释


log_format
:定义日志格式,常用变量:

$remote_addr
:客户端 IP
$time_local
:请求时间(如 10/Oct/2024:14:22:10 +0800)
$request
:请求行(如 GET /index.html HTTP/1.1)
$status
:HTTP 状态码(200/404/502)
$request_time
:请求处理时间(单位:秒,如 0.002)
$http_referer
:Referer(从哪个页面跳转过来)
$http_user_agent
:用户代理(浏览器 / 爬虫)

实验:自定义访问日志格式(记录响应时间和客户端 IP)

修改 http 层配置,添加自定义日志格式

bash



vim /etc/nginx/nginx.conf
http {
    # 在http层开头添加自定义日志格式(起名为my_log)
    log_format  my_log  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $request_time "$http_referer" '
                       '"$http_user_agent"';
    # 所有站点使用my_log格式(或在单个server块里配置)
    access_log  /var/log/nginx/access.log  my_log;
    # 其他配置...
}

重载配置 & 测试

bash



systemctl reload nginx
# 访问网站后,查看日志
tail -f /var/log/nginx/access.log  # 实时查看日志
# 输出示例(能看到request_time,如0.001):
# 192.168.1.1 - - [10/Oct/2024:14:30:00 +0800] "GET / HTTP/1.1" 200 0.001 "http://www.test1.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/117.0.0.0 Safari/537.36"

2. 日志切割(避免日志文件过大)

日志会不断增长,若不切割,单个日志文件可能达几十 GB,无法打开。用
logrotate
工具实现自动切割。

实验:配置日志切割(按天切割,保留 30 天)

创建 logrotate 配置文件

bash



vim /etc/logrotate.d/nginx
# 粘贴以下内容
/var/log/nginx/*.log {  # 要切割的日志路径(所有.log文件)
    daily  # 按天切割
    rotate 30  # 保留30天的日志,超过30天删除
    missingok  # 日志文件不存在时,不报错
    compress  # 压缩旧日志(用gzip,节省空间)
    delaycompress  # 延迟压缩(切割后,下一次切割时再压缩上一次的日志)
    notifempty  # 日志为空时,不切割
    create 0644 nginx nginx  # 切割后新建日志文件的权限、用户、用户组
    sharedscripts  # 所有日志切割完成后,只执行一次postrotate脚本
    postrotate  # 切割后执行的脚本(重载Nginx,让新日志生效)
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

测试日志切割

bash



# 手动执行切割(测试用)
logrotate -f /etc/logrotate.d/nginx
# 查看切割后的日志
ls /var/log/nginx/
# 会看到access.log(新日志)、access.log.1(刚切割的旧日志,下次切割会变成access.log.1.gz)

logrotate 的定时任务
系统默认会定时执行 logrotate(
/etc/cron.daily/logrotate
),每天凌晨执行一次,无需手动配置。

七、Nginx 性能优化(让 Nginx 跑得更快)

目标:通过调整配置,提升 Nginx 的并发能力、响应速度,减少资源占用。

1. 核心优化参数(按模块分类)

优化维度 参数 推荐配置 作用解释
进程优化 worker_processes 等于 CPU 核心数(如 4 核设为 4) 每个进程绑定一个 CPU,减少切换开销
进程优化 worker_cpu_affinity 0001 0010 0100 1000(4 核) 绑定进程到指定 CPU 核心(避免进程漂移)
连接优化 worker_connections 10240(根据系统调整) 每个进程最大连接数,提升并发
连接优化 use epoll on(默认开启,确认配置) 启用 Linux 最优事件模型,处理高并发
HTTP 优化 keepalive_timeout 65s(默认)或 30s(高并发场景) 长连接超时时间,减少 TCP 握手次数
HTTP 优化 keepalive_requests 1000(默认 100) 一个长连接最多处理 1000 个请求,避免连接老化
静态资源优化 sendfile on 启用零拷贝(数据不经过用户态,直接内核态传输)
静态资源优化 tcp_nopush on(配合 sendfile) 一次性发送所有数据,减少网络包数量
静态资源优化 tcp_nodelay on(高并发场景) 有数据就立即发送,减少延迟
静态资源优化 gzip on on 压缩静态资源,减少传输体积
静态资源优化 expires 30d 对图片 / CSS/JS 设置 30d-1y 缓存 浏览器缓存,减少重复请求

2. 实验:配置性能优化(以 4 核 CPU 为例)

修改 nginx.conf 配置

bash



vim /etc/nginx/nginx.conf
# 1. main层优化
worker_processes  4;  # 4核CPU
worker_cpu_affinity 0001 0010 0100 1000;  # 绑定每个进程到不同CPU核心
worker_rlimit_nofile 65535;  # 每个进程最大打开文件数(避免too many open files)
 
# 2. events层优化
events {
    worker_connections  10240;
    use epoll;
    multi_accept on;  # 一个进程同时接受多个连接,提升并发
}
 
# 3. http层优化
http {
    # gzip压缩优化
    gzip on;
    gzip_min_length 1k;  # 小于1k的文件不压缩(避免浪费CPU)
    gzip_buffers 4 16k;  # 压缩缓冲区大小
    gzip_comp_level 6;  # 压缩级别(1-9,越高压缩率越高,CPU占用越多)
    gzip_types text/plain text/css application/json application/javascript image/png;  # 压缩的文件类型
 
    # 长连接优化
    keepalive_timeout 30s;  # 高并发场景缩短到30s
    keepalive_requests 1000;
 
    # 静态资源传输优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
 
    # 其他配置...
}

重载配置 & 测试优化效果

bash



systemctl reload nginx
# 用ab工具压测对比(优化前vs优化后)
ab -n 10000 -c 1000 http://www.test1.com/
# 观察QPS(Requests per second):优化后QPS会明显提升,响应时间(Time per request)会减少

八、Nginx 排障技巧(工作中必用,避免踩坑)

遇到问题不要慌,按以下步骤排查:

1. 常见错误及解决方法

错误现象 可能原因 排查步骤
Nginx 启动失败(active (failed)) 配置文件语法错误、端口被占用、权限不足 1. 检查配置语法:
nginx -t
;2. 检查端口:`ss -tuln
grep 80
;3. 看错误日志:
tail -f /var/log/nginx/error.log`
访问报 404 根目录错误、文件不存在、location 匹配错误 1. 确认
root
路径是否正确;2. 检查文件是否存在(如
ls /data/www/test1/index.html
);3. 看访问日志:
tail -f /var/log/nginx/access.log
(看请求的 URL 是否匹配)
访问报 502 Bad Gateway 后端服务挂了、后端端口不通、代理地址错误 1. 检查后端服务是否启动(如
systemctl status tomcat
);2. 测试后端端口:
telnet 127.0.0.1 8080
;3. 看 Nginx 错误日志(是否有 “connect () failed”)
访问报 504 Gateway Timeout 后端服务响应慢、代理超时设置太短 1. 检查后端服务是否卡顿(如
top
看 CPU / 内存);2. 增加
proxy_connect_timeout

proxy_read_timeout
(如设为 60s)
HTTPS 报 “证书无效” 证书过期、证书与域名不匹配、证书链不完整 1. 检查证书有效期:
openssl x509 -in /etc/letsencrypt/live/xxx/fullchain.pem -noout -dates
;2. 确认证书域名是否正确;3. 用 SSL 检测工具(如https://www.ssllabs.com/ssltest/)检查

2. 常用排障命令

bash



# 1. 检查配置语法
nginx -t
 
# 2. 查看Nginx进程
ps -ef | grep nginx  # 看是否有master和worker进程(正常应有1个master+N个worker)
 
# 3. 查看监听端口
ss -tuln | grep nginx  # 看80/443端口是否在监听
 
# 4. 实时查看错误日志(排障核心)
tail -f /var/log/nginx/error.log
 
# 5. 实时查看访问日志(看请求是否到达Nginx)
tail -f /var/log/nginx/access.log
 
# 6. 测试后端服务连通性(排查502)
telnet 127.0.0.1 8080  # 测试后端8080端口是否通;不通则后端问题
 
# 7. 查看Nginx状态(需启用stub_status模块)
# 先在nginx.conf添加状态配置:
location /nginx_status {
    stub_status on;
    allow 127.0.0.1;  # 只允许本地访问,安全
    deny all;
}
# 访问状态页:curl http://127.0.0.1/nginx_status
# 输出解释:
# Active connections: 2  # 当前活跃连接数
# server accepts handled requests: 100 100 200  # 总接受连接数/处理连接数/总请求数
# Reading: 0 Writing: 1 Waiting: 1  # 读请求/写响应/等待连接数
© 版权声明

相关文章

暂无评论

none
暂无评论...