一、前提知识准备(必学!否则后续配置看不懂)
Nginx 跑在 Linux 上,且依赖网络协议,先掌握以下基础,避免 “卡壳”:
1. Linux 系统基础(核心命令)
必备命令:(目录操作)、
cd/pwd/ls(包管理)、
yum/apt(服务管理)、
systemctl(编辑配置文件)、
vim(查看端口)、
netstat/ss(进程管理)、
ps/top(压缩解压)、
tar/gzip(权限管理)解释:比如
chmod/chown启动服务,
systemctl start nginx查看 80 端口是否占用,这些是后续操作的 “基本功”。
ss -tuln | grep 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)为正常)
测试访问:
关闭防火墙(测试环境,生产环境需放通端口):浏览器输入 Linux 的 IP 地址(如http://192.168.1.100),能看到 Nginx 默认欢迎页(“Welcome to nginx!”),说明服务正常。
systemctl stop firewalld
关键路径(记下来!后续改配置用)
主配置文件:默认站点配置:
/etc/nginx/nginx.conf日志文件:
/etc/nginx/conf.d/default.conf(access.log 访问日志,error.log 错误日志)网页根目录:
/var/log/nginx/(默认欢迎页在这里)
/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:嵌套在 main 里,控制网络连接(如并发数)
events:嵌套在 main 里,所有 HTTP 服务的公共配置(如日志格式、压缩)
http:嵌套在 http 里,一个 server 就是一个 “网站”(如www.xxx.com和blog.xxx.com是两个 server)
server:嵌套在 server 里,匹配 URL 路径(如访问 /www/ 和 /blog/ 是两个 location)
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.html 不同),删除 index.html 后刷新浏览器,会显示 index.htm 的内容(因为
index.htm参数是按顺序找的)。
index
3. 基础配置实验:调整并发能力(修改 worker_processes 和 worker_connections)
实验目标
理解 “工作进程数” 和 “每个进程最大连接数” 如何影响 Nginx 的并发能力,学会根据 CPU 核心数优化。
知识点解释
:工作进程数,推荐设置为 CPU 核心数(比如 4 核 CPU 设为 4),因为每个进程是单线程,绑定一个 CPU 核心能减少切换开销。
worker_processes:每个工作进程的最大连接数(默认 1024),Nginx 的理论最大并发数 = worker_processes × worker_connections(但实际受限于系统打开文件数)。
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:给路径起别名(和 root 的区别:
alias /path,访问
location /img/ { alias /data/img/; }对应
/img/1.jpg,而 root 会多拼接
/data/img/1.jpg)
/img/:设置浏览器缓存(静态资源 30 天内不重新下载,减少请求)
expires 30d:启用 gzip 压缩(缩小文件体积,加速传输)
gzip on
实验:搭建静态资源服务器(存放图片和 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)Mac/Linux:打开
192.168.1.100 static.test.com,添加同上内容 测试访问:
/etc/hosts
浏览器输入:能看到蓝色标题、绿色文字和 Nginx 图片,说明静态资源加载正常。访问
http://static.test.com:能看到目录下的 nginx.png 文件,说明 autoindex 生效。查看网络请求(浏览器按 F12→Network):CSS 和图片的 “Size” 列会显示 “from disk cache”(缓存生效),“Content-Encoding” 列显示 “gzip”(压缩生效)。
http://static.test.com/img/
场景 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
测试访问:
浏览器输入:显示 “这是 test1 网站!”浏览器输入
http://www.test1.com:显示 “这是 test2 网站!”原理:浏览器请求时会携带
http://www.test2.com头(如 Host: www.test1.com),Nginx 根据
Host匹配对应的 server 块。
server_name
场景 3:反向代理(Nginx 作为 “中间人”,转发请求到后端服务)
反向代理是 Nginx 的 “核心功能”,比如:用户访问(Nginx),Nginx 偷偷把请求转发到后端的 Tomcat/Node.js/Java 服务(如
http://www.xxx.com),用户看不到后端服务,安全性高。
http://127.0.0.1:8080
知识点解释
关键参数:
:核心!指定后端服务的 IP: 端口(如
proxy_pass http://后端服务地址)
proxy_pass http://127.0.0.1:8080:传递客户端的 Host 头(后端服务需要知道用户访问的域名)
proxy_set_header Host $host:传递客户端真实 IP(否则后端看到的 IP 是 Nginx 的 IP)
proxy_set_header X-Real-IP $remote_addr:传递代理链 IP(多代理场景)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
实验:用 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
浏览器输入(没有加 8080 端口),能看到 Tomcat 默认页,说明代理成功。验证真实 IP 传递:在 Tomcat 的日志文件(
http://proxy.test.com)中,能看到客户端的真实 IP(如 192.168.1.1),而不是 127.0.0.1(Nginx 的 IP),说明
/usr/local/tomcat/logs/localhost_access_log.2024-xx-xx.txt生效。
X-Real-IP
场景 4:负载均衡(多后端服务分摊压力,避免单点故障)
当后端服务(如 Tomcat)访问量太大时,单台服务器扛不住,负载均衡能把请求 “均匀分配” 到多台后端服务器,同时实现 “故障自动剔除”(某台后端挂了,Nginx 不转发请求给它)。
知识点解释
核心模块:(定义后端服务器组)常用调度算法(默认轮询):
upstream
| 算法 | 原理 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按顺序依次转发给后端服务器 | 后端服务性能一致时 |
| 权重(weight) | 权重越高,接收的请求越多(如) |
后端性能不一致(高配权重高) |
| ip_hash | 同一客户端 IP 始终转发给同一后端服务器 | 需要会话保持(如登录状态) |
| fair | 按后端服务器的响应时间分配(响应快的多接) | 追求性能最优 |
健康检查:Nginx 默认是 “被动健康检查”(后端挂了,Nginx 尝试几次失败后,暂时不转发),参数:
:允许请求失败的最大次数(默认 1)
max_fails=3:失败后,30 秒内不再转发请求给该后端(默认 10 秒)
fail_timeout=30s
实验:配置负载均衡(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:刷新浏览器,此时所有请求都转发到 8081(只显示 8081),说明 Nginx 剔除了故障的 8080。重启 Tomcat1:
/usr/local/tomcat/bin/shutdown.sh,30 秒后刷新,8080 又会重新接收请求(fail_timeout=30s 生效)。
/usr/local/tomcat/bin/startup.sh
五、HTTPS 配置(让网站更安全,现在是标配)
HTTP 是明文传输,数据容易被窃取;HTTPS 是 “HTTP+SSL/TLS”,数据加密传输,且需要证书验证服务器身份。
知识点解释
证书类型:
免费证书:Let's Encrypt(有效期 3 个月,可自动续期),适合个人 / 中小企业。付费证书:Symantec/GeoTrust(有效期 1-2 年,带企业验证,适合大型网站)。 Nginx HTTPS 关键参数:
:监听 443 端口(HTTPS 默认端口)
listen 443 ssl:证书公钥路径
ssl_certificate /path/xxx.pem:证书私钥路径
ssl_certificate_key /path/xxx.key:启用安全的 TLS 版本(禁用 SSLv2/SSLv3,有漏洞)
ssl_protocols TLSv1.2 TLSv1.3:优先使用服务器的加密套件(更安全)
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 生效。点击小绿锁→“证书”,能看到 Let's Encrypt 的证书信息,有效期 3 个月。 配置自动续期(避免证书过期):
https://www.yourdomain.com
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
:客户端 IP
$remote_addr:请求时间(如 10/Oct/2024:14:22:10 +0800)
$time_local:请求行(如 GET /index.html HTTP/1.1)
$request:HTTP 状态码(200/404/502)
$status:请求处理时间(单位:秒,如 0.002)
$request_time:Referer(从哪个页面跳转过来)
$http_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. 检查配置语法:;2. 检查端口:`ss -tuln |
grep 80tail -f /var/log/nginx/error.log` |
| 访问报 404 | 根目录错误、文件不存在、location 匹配错误 | 1. 确认路径是否正确;2. 检查文件是否存在(如);3. 看访问日志:(看请求的 URL 是否匹配) |
|
| 访问报 502 Bad Gateway | 后端服务挂了、后端端口不通、代理地址错误 | 1. 检查后端服务是否启动(如);2. 测试后端端口:;3. 看 Nginx 错误日志(是否有 “connect () failed”) |
|
| 访问报 504 Gateway Timeout | 后端服务响应慢、代理超时设置太短 | 1. 检查后端服务是否卡顿(如看 CPU / 内存);2. 增加和(如设为 60s) |
|
| HTTPS 报 “证书无效” | 证书过期、证书与域名不匹配、证书链不完整 | 1. 检查证书有效期:;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 # 读请求/写响应/等待连接数

