nginx
脚本化
一键安装脚本
set -e # 后续命令执行错误直接退出脚本
#!/bin/bash # 指定默认使用的解释器
1.
# 下载nginx源码安装包
mkdir /nginx # 新建目录存放nginx项目文件
cd /nginx
curl -O https://nginx.org/download/nginx-1.26.3.tar.gz
tar -xzf nginx-1.26.3.tar.gz
cd nginx-1.26.3
2.
# 安装需要的依赖软件包
yum -y install zlib zlib-devel openssl openssl-devel pcre \
pcre-devel gcc gcc-c++ autoconf automake make psmisc net-tools lsof vim wget -y
3.
# 编译前的配置工作(选择开启的功能)
#编译前的配置工作
./configure **--prefix=/usr/local/nginx1** --user=chenjian --group=chenjian \
--with-threads --with-http_v2_module --with-http_stub_status_module \
--with-http_ssl_module --with-stream \
--with-http_gunzip_module
# --prefix 指定nginx的工作目录
4.
# 启动两个进程进行编译,将C语言代码编译成二进制程序
make -j 2
# 编译安装
make install
# 修改环境变量
echo 'PATH=/usr/local/nginx1/sbin/:$PATH' >> /etc/bashrc
# source /etc/bashrc 重新加载环境变量,新进程中使用(不同进程)
# 启动nginx
nginx
一键卸载nginx服务
1. 停止nginx服务
nginx -s stop
2. 删除PATH中相关路径
3. 删除nginx的工作目录
1. 使用find查看nginx的相关目录
find / -name "*nginx*"
4. 删除/etc/rc.local里的开机启动
nginx热升级
1. 备份旧的nginx二进制文件
/usr/local/nginx/sbin
[root@sc sbin]# ls
nginx nginx.old
2. 编译新版本的nginx二进制文件
1.curl下载tar.gz包
2. tar xzf 解压
3. 进入目录编译(自定义配置)
3. 替换旧的二进制文件
4. 通知老的nginx master进程启动新的nginx master进程(新旧并存)
kill -12 [pid] # 通知旧进程加载新的进程
此时可以进行测试回滚,如果新的进程存在问题需要回滚
kill -1 [old pid]
kill -3 [new pid]
5. 退出老的master进程
kill -3 [old pid] # 优雅退出
编辑nginx配置参数configure
# 1. 基础配置参数
--prefix=PATH:指定 Nginx 的安装目录,默认是/usr/local/nginx。
--sbin-path=PATH:设定 Nginx 可执行文件的安装路径,默认是prefix/sbin/nginx。
--conf-path=PATH:指定 Nginx 配置文件的路径,默认是prefix/conf/nginx.conf。
# 2. HTTP 核心模块
--with-http_ssl_module:启用 HTTPS 支持
--with-http_v2_module:启用 HTTP/2 支持
# HTTP/2 具备更快的传输速度和更好的性能,能显著提升网站的响应速度。
--with-http_gzip_static_module:开启静态文件 gzip 压缩功能。
主配置文件(nginx.conf)
主配置文件结构
Nginx 配置文件采用模块化结构,由多个 上下文(Context) 组成,每个上下文用大括号 {} 包围,包含特定功能的配置指令。主要上下文包括:
- 全局块:配置影响 Nginx 全局的参数,如用户权限、工作进程数等。
- events 块:配置网络连接相关的参数,如并发连接数、事件模型等。
- http 块:配置 HTTP 服务器的全局参数,包含多个
server块。 - server 块:配置虚拟主机(网站),包含多个
location块。 - location 块:配置 URL 匹配规则和请求处理方式。
全局块(main上下文)
# 运行 Nginx 进程的用户和用户组
user nginx;
# 工作进程数,通常设置为 CPU 核心数
worker_processes auto;
# 错误日志路径和级别
error_log /var/log/nginx/error.log warn;
# 进程 ID 存储文件
pid /var/run/nginx.pid;
# 包含其他配置文件
include /etc/nginx/modules-enabled/*.conf;
events块
events {
# 每个工作进程允许的最大并发连接数
worker_connections 1024;
# 事件处理模型(epoll 是 Linux 下的高效模型)
use epoll;
# 允许一个工作进程同时接受多个新连接
multi_accept on;
}
http块
http {
# 文件扩展名与 MIME 类型的映射表
include /etc/nginx/mime.types;
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;
# 开启高效文件传输模式 不牵扯用户模式向内核模式切换
sendfile on;
# 防止网络小包的频繁发送
tcp_nopush on;
# 减少页面加载时间
tcp_nodelay on;
# 保持长连接的超时时间
keepalive_timeout 65;
# 开启 gzip 压缩,减少在网络中传输数据的次数
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# 包含所有虚拟主机配置文件
include /etc/nginx/conf.d/*.conf;
}
server块(虚拟主机配置)
server {
# 监听的端口和 IP
listen 80;
server_name example.com www.example.com; # 域名
# 字符集设置
charset utf-8;
# 访问日志
access_log /var/log/nginx/example.access.log;
# 默认请求处理
location / {
root /var/www/example.com; # 网站根目录
index index.html index.htm; # 默认首页文件
}
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error_pages;
}
}
location 块(URL 匹配规则)
location匹配顺序
nginx有两层指令来匹配请求 URI 。第一个层次是 server 指令,它通过域名、ip 和端口来做第一层级匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。
location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求URI 会按如下规则进行匹配:
1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的,都会匹配这里处理
# 精确匹配 /favicon.ico
location = /favicon.ico {
log_not_found off; # 不记录找不到文件的日志
access_log off; # 关闭访问日志
}
# 匹配以 /static/ 开头的路径
location ^~ /static/ {
root /var/www/assets; # 实际文件路径为 /var/www/assets/static/
expires 30d; # 静态资源缓存 30 天
}
# 匹配 PHP 请求(通过 FastCGI 转发)
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # PHP-FPM 套接字
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 重定向 HTTP 到 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 永久重定向
}
虚拟主机的类型
- 基于域名
- 基于IP
- 基于端口
nginx的使用
常用参数
nginx -t # 检查nginx配置文件的语法
nginx -v # 查看nginx的版本
nginx -V # 查看nginx版本详细信息(编译信息)
启动相关
-
reload 重新加载nginx配置文件,nginx程序不会退出,始终保持连接
首先将新的work process加载,然后停掉旧的work实现更替
-
restart 重启nginx程序,当nginx出现严重的错误时才会选择重启
此时nginx创建的web服务将会断开
# 向nginx进程发送信号
nginx -s
# 发送reload信号,刷新nginx服务
nginx -s reload
# 发送restart信号 重启nginx
nginx -s restart
# 停止nginx服务进程
nginx -s stop
# 优雅停止nginx - 主进程通知不再接受新的请求,待当前请求处理完成后关闭连接
nginx -s quit
-
nginx开机启动(创建service文件,使用systemctl管理)
(1) 编写nginx service配置文件
sudo vim /etc/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=/run/nginx.pid # Nginx 可执行文件路径(根据实际情况调整) 以及各种动作 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/usr/sbin/nginx -s reload ExecStop=/usr/sbin/nginx -s stop ExecQuit=/usr/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target(2) 重载systemd管理器配置并设置开机自启
systemctl restart daemon-reload systemctl enable nginx
nginx日志
-
access.log
nginx的访问日志。记录了客户端对 Nginx 服务器的所有访问请求信息,包括请求的来源、主机IP、时间、请求的资源、响应状态码等,
-
error.log
记录了 Nginx 服务器在运行过程中发生的错误信息,包括配置错误、连接问题、文件读取错误等。
**日志配置:**主配置文件 nginx.conf
http {
# 访问日志配置
access_log /var/log/nginx/access.log main;
# 错误日志配置
error_log /var/log/nginx/error.log error;
}
nginx的重要模块
nginx的作用
负载均衡/IO多路复用
IO多路复用实现
修改events中的worker_connections 1024;
events {
use epoll; # 显式指定使用 epoll
worker_connections 1024; # 每个工作进程支持的最大连接数
}
多路复用中的模型:
1. select 模型
select 是最早的 IO 多路复用实现,兼容性好。
轮询/线性扫描/数量限制(1024) 不适合处理大量连接
2. epoll 模型
epoll 是 Linux 2.6 内核引入的高效 IO 多路复用机制,专为处理大量连接优化。
状态统计
在server配置块中添加状态信息统计的功能
实质上是加一段路由
location =/ status {
stub_status;
}
访问www.wang.com/status
Active connections: 2
server accepts handled requests
40 40 41
Reading: 0 Writing: 1 Waiting: 1
权限认证
httpd-tool 设置密码
yum provides htpasswd
yum install htpass-tools -y
# 创建新的密码文件并添加用户 (替换 username 为实际用户名)
htpasswd -c /etc/nginx/.htpasswd username
# 后续添加用户时省略 -c 参数
htpasswd /etc/nginx/.htpasswd anotheruser
添加至保护路由
location /admin/ {
auth_basic "sanchuang"; # 自定义提示信息
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://backend;
}
dey和allow
location / {
deny all;
allow 192.168.1.1; # 允许单个 IP
allow 10.0.0.0/8; # 允许整个网段
}
nginx限速和限制并发连接
网站的带宽是有限的,可以对下载的时候的用户进行限制
限制带宽主要使用 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,前者用于连接数限制,后者用于请求频率限制。对于带宽限制,主要使用limit_rate 和 limit_rate_after 指令。
-
limit_rate限制下载的速度(limit_rate 256k;) -
limit_rate_after当达到多少时开始限制下载(limit_rate_after 10m; # 前 10MB 不限制) -
ngx_http_limit_conn_module限制连接数http { limit_conn_zone $binary_remote_addr zone=per_ip:10m; limit_conn_zone $server_name zone=per_server:10m; server { listen 80; location / { # 每个 IP 最多 10 个连接 limit_conn per_ip 10; # 整个服务器最多 1000 个连接 limit_conn per_server 1000; # 连接速率限制(可选) limit_rate 100k; } } }
nginx限制请求数量
1. 基于漏桶算法的请求限制
使用 limit_req_zone 和 limit_req 指令实现:
http {
# 定义一个名为 req_limit 的共享内存区域,基于客户端 IP 统计请求
# 速率限制为每秒 10 个请求(burst=20 允许突发 20 个请求)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 80;
location / {
# 应用请求限制,突发请求会被延迟处理
limit_req zone=req_limit burst=20;
# 可选:超过突发限制的请求直接返回 503
# limit_req zone=req_limit burst=20 nodelay;
}
}
}
负载均衡
负载均衡(Load Balancing)是一种将流量均匀分配到多个服务器的技术,通过将请求分发到多个后端服务器,能够提高应用的可用性、可靠性和处理能力。
Nginx 作为高性能的 Web 服务器和反向代理,提供了强大而灵活的负载均衡功能。
- 二层负载均衡(数据链路层)
- 三层负载均衡(网络层的路由器)
- 四层负载均衡(传输层的端口号) nginx支持
- 七层负载均衡(应用层的http协议实现) nginx支持
- DNS实现域名解析 - 负载均衡
调度算法
- 轮询 round-robin(绝对公平 默认)
- 最小连接数 least-connected 基于七层或者四层
- IP哈希 基于客户机的IP地址计算哈希值,如果哈希值相同则访问特定的服务器,适合于需要保持sessions一直的网站
基础负载均衡配置使用
- 定义后端服务器组(https同样,https可以负载到http服务上)
在 http 块中使用 upstream 指令定义后端服务器组:
http {
# 定义名为 backend 的服务器组
upstream backend {
server backend1.example.com weight=5; # 权重为 5
server backend2.example.com weight=3; # 权重为 3
server backend3.example.com weight=2; # 权重为 2
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 1. 将请求转发到后端服务器组
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 支持多种负载均衡算法,通过不同指令配置:
upstream backend {
# 轮询(默认)
server backend1.example.com;
server backend2.example.com;
# 加权轮询
server backend1.example.com weight=5;
server backend2.example.com weight=3;
# IP 哈希(会话保持)
ip_hash;
server backend1.example.com;
server backend2.example.com;
# 最少连接
least_conn;
server backend1.example.com;
server backend2.example.com;
# 基于响应时间(需要安装第三方模块)
fair;
server backend1.example.com;
server backend2.example.com;
}
健康检测
负载均衡器检查后端真实的web服务器是否在运行网站
如果后端服务器全部挂掉了,nginx会报出502(bad Gateway)错误
- backup 备份服务器
- down 显示标识特定服务器不可用(后端服务器维护)
upstream backend {
server backend1.example.com weight=5 max_fails=3 fail_timeout=30s;
server backend2.example.com weight=3 backup; # 备用服务器
server backend3.example.com down; # 暂时标记为不可用
}
虽然 Nginx 原生不提供健康检查,但可以通过以下方式实现:
upstream backend {
server backend1.example.com;
server backend2.example.com;
# 使用 nginx_upstream_check_module 模块(需要额外安装)
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "GET /health HTTP/1.1\r\nHost: $host\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
后端服务器无法获取真实客户端 IP
-
使用 X-Forwarded-For 请求头
upstream backend { server backend1.example.com; } server { listen 80; location / { proxy_pass http://backend; 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; } } # X-Real-IP:记录客户端的真实 IP # X-Forwarded-For:记录请求经过的所有代理 IP,格式为 client_ip, proxy1_ip, proxy2_ip # X-Forwarded-Proto:记录客户端使用的协议(HTTP/HTTPS) -
后端服务器解析真实IP(或者nginx服务器日志进行字段解析获得真实IP)
from flask import request @app.route('/') def index(): client_ip = request.headers.get('X-Real-IP') or request.remote_addr return f"Your IP: {client_ip}"
TCP/UDP四层负载均衡
基于 IP + 端口分发:负载均衡器根据客户端的 IP 地址和目标端口(如 80/TCP、443/TCP)将流量转发到后端服务器。
# 实现配置文件内容
worker_processes 4;
events {
worker_connections 2048;
}
stream {
upstream dns_servers {
server 192.168.10.147:53;
}
upstream web_servers {
server 192.168.71.148:80;
server 192.168.71.149:80;
}
server {
listen 80 ;
proxy_pass web_servers;
}
server {
listen 53 udp ;
proxy_pass dns_servers;
}
}
# 负载均衡配置文件示例:/etc/nginx/nginx.conf
stream {
# 定义日志格式
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
# 定义访问日志
access_log /var/log/nginx/stream_access.log proxy;
# 开启 TCP 负载均衡
upstream backend_tcp {
# 配置后端服务器,可根据实际情况调整权重、健康检查等参数
server backend1.example.com:8080 weight=5 max_fails=3 fail_timeout=30s;
server backend2.example.com:8080 weight=3 max_fails=3 fail_timeout=30s;
server backend3.example.com:8080 weight=2 max_fails=3 fail_timeout=30s;
# 负载均衡算法,可选值:round_robin、least_conn、ip_hash 等
least_conn;
}
# 配置 UDP 负载均衡(示例)
upstream backend_udp {
server backend1.example.com:53 weight=5;
server backend2.example.com:53 weight=3;
server backend3.example.com:53 weight=2;
}
# TCP 负载均衡监听配置
server {
listen 80; # 监听的端口
proxy_connect_timeout 10s;
proxy_timeout 300s;
proxy_pass backend_tcp; # 指定上游服务器组
}
# UDP 负载均衡监听配置(示例)
server {
listen 53 udp; # 监听的 UDP 端口
proxy_responses 1;
proxy_timeout 60s;
proxy_pass backend_udp;
}
}
压力测试
压力测试的工具
- ab(局域网也可以使用) apach
- 阿里云PTS(公网使用)
相关概念:
- pv (page review) :页面浏览量
使用:
yum install httpd-tools -y
ab -n 1000 -c 100 http://example.com/
# -n 总请求数
# -c 并发请求数
Server Software: nginx/1.26.3
Server Hostname: 192.168.71.248
Server Port: 80
Document Path: /
Document Length: 620 bytes
Concurrency Level: 10
Time taken for tests: 0.506 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 853000 bytes
HTML transferred: 620000 bytes
Requests per second: 1977.86 [#/sec] (mean)
Time per request: 5.056 [ms] (mean)
Time per request: 0.506 [ms] (mean, across all concurrent requests)
Transfer rate: 1647.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.5 1 8
Processing: 2 4 1.3 3 14
Waiting: 2 3 1.3 3 14
Total: 3 5 1.5 5 15
Percentage of the requests served within a certain time (ms)
50% 5
66% 5
75% 5
80% 6
90% 6
95% 7
98% 9
99% 12
100% 15 (longest request)
高可用
可以实现的软件
- Keepalived
- Heartbeat
- HAproxy
keeplived
功能
-
负载均衡
底层通过lvs实现高可用性,调用内核里已经安装的lvs模块来实现负载均衡
lvs的另外一个名字叫ipvs
-
高可用
通过VRRP协议来实现
VRRP协议
虚拟路由器冗余协议(Virtual Router Redundancy Protocol,VRRP)是一种用于实现路由器冗余和高可用性的协议。
VRRP 将一组路由器组成一个虚拟路由器(VIP)。有一个主路由器(Master)和多个备份路由器(Backup)
安装使用
-
安装keepalived
yum install keepalived -y -
查看配置文件 配置一台作为MASTER 一台作为BACKUP
实现VIP漂移
! Configuration File for keepalived # 全局配置 global_defs { router_id LVS_DEVEL # 路由标识,需唯一 script_user root # 执行脚本的用户 enable_script_security # 启用脚本安全检查 } # VRRP实例配置(实现高可用) vrrp_instance VI_1 { state MASTER # 初始状态:MASTER或BACKUP interface eth0 # 绑定的网络接口 virtual_router_id 51 # 虚拟路由ID,1-255之间 priority 100 # 优先级,数值越高越优先 advert_int 1 # VRRP通告间隔(秒) # 认证配置(可选) authentication { auth_type PASS # 认证类型:PASS或AH auth_pass 1111 # 认证密码 } # 虚拟IP地址配置 virtual_ipaddress { 192.168.1.100 # VIP地址 } # 跟踪脚本(监控服务器健康状态) track_script { chk_http_port # 引用下面定义的检查脚本 } } # 健康检查脚本配置 vrrp_script chk_http_port { script "/etc/keepalived/check_nginx.sh" # 脚本路径 interval 2 # 检查间隔(秒) weight -20 # 检查失败时优先级降低20 fall 2 # 连续2次失败才认为服务器不可用 rise 1 # 1次成功即认为服务器恢复 } # 虚拟服务器配置(用于负载均衡) virtual_server 192.168.1.100 80 { delay_loop 6 # 健康检查间隔(秒) lb_algo rr # 负载均衡算法:rr(轮询)、wrr(加权轮询)等 lb_kind DR # 负载均衡模式:NAT、DR、TUN persistence_timeout 50 # 会话保持时间(秒) protocol TCP # 协议类型 # 真实服务器配置 real_server 192.168.1.101 80 { weight 10 # 权重值 SSL_GET { url { path / # 检查的URL路径 digest ff20ad2481f8d0384d87a256d65ecf6 # 预期的MD5摘要 } url { path /mrtg/ # 另一个检查路径 digest 9b3a0c85a887217160d61c57ae16234 } connect_timeout 3 # 连接超时时间(秒) retry 3 # 重试次数 delay_before_retry 3 # 重试前的延迟时间(秒) } } # 可以添加多个real_server... real_server 192.168.1.102 80 { weight 10 SSL_GET { # 类似的健康检查配置 } } }
单双VIP
单VIP会导致其余负载均衡机器闲置
双VIP架构:通过在两个或多个服务器节点上配置两个虚拟 IP 地址(VIP) - 互为主备,来提供更可靠的服务和负载均衡能力。
脑裂问题
两台或者多台LB上面都有vip地址
原因:
- 设置了不同的虚拟id
- 防火墙挡住了VRRP组播报文的传输
- 认证密码不一样导致脑裂
网络安全攻击
dos攻击 - 拒绝服务攻击
特点:
- 攻击来自于单一设备或网络
- 攻击流量有限
- 可以通过防火墙进行防范
常见攻击类型
- SYN洪水攻击:发送大量伪造的SYN请求,耗尽服务器的连接资源
- ping洪水攻击:发送大量的ICMP请求,耗尽目标网络的带宽
- UDP
ddos攻击 - 分布式拒绝服务攻击
通过控制大量的僵尸计算机对目标主机发起攻击
特点:
- 攻击来自不同的机器,来源广泛
- 汇聚了多台机器的攻击,攻击规模大
- 攻击来源广泛,较难防范与追踪
防范
- 配置防火墙策略,将外部网络进来的网络隔离
- 购买对应的DDos防御服务商,帮助过滤攻击
- 增加集群数量,设置高可用和负载均衡策略
CC(Challenge Collapsar,挑战黑洞)攻击
是一种常见的网络攻击方式,属于 DDoS 攻击的一种变体。
通过控制大量的计算机(僵尸网络)模拟正常用户向目标服务器发送海量的 HTTP 请求,以消耗服务器的资源。
攻击特点:
- 隐蔽性强:通过伪造大量的http请求获取网页资源,模拟用户的行为,难以辨别
- 自动化攻击
防范:
- WAF(web应用防火墙) 部署在客户机和服务器之间
- 流量过滤
1490

被折叠的 条评论
为什么被折叠?



