Nginx 服务器实践完整详细总结
原创2025年3月10日...大约 12 分钟
Nginx 服务器实践完整详细总结
Nginx 应用简介以及多域名访问图
nginx 在大型系统架构中担任高性能 web 服务器、反向代理负载均衡器、高性能流量网关、应用网关、日志服务器等,是互联网项目的一个主要入口,主要特点有:安全、稳定、高性能。
可以通过多虚拟主机实现多域名绑定同一 ip,nginx 通过域名判断后访问不同站点。
Windows 下配置虚拟主机 V-HOST
windows下修改 hosts 文件,在文档结尾处新增一行记录 虚拟机IP aaron.com。
例如:192.168.3.100 aaron.com
浏览器中输入:http://aaron.com/ 这样就可以访问到虚拟主机中 nginx 服务器网站主页。
Keepalived 基础配置
防爬虫工具安装使用
---------------------------------
防爬虫工具 Fail2ban 安装和配置步骤
---------------------------------
sudo apt update
sudo apt install fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# 修改后重启
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client status nginx-http-auth
# 手动封禁 IP:
sudo fail2ban-client set <jail名称> banip <IP地址>
sudo fail2ban-client set sshd banip 27.189.143.246
# 手动解封 IP:
sudo fail2ban-client set <jail名称> unbanip <IP地址>
sudo fail2ban-client set sshd unbanip 192.168.1.100
# 查看日志:
sudo tail -f /var/log/fail2ban.log
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时间(秒)
bantime = 3600
# 检测时间范围(秒)
findtime = 600
# 最大失败次数
maxretry = 5
# 封禁动作(默认是 iptables)
banaction = iptables-multiport
# 日志文件路径
logpath = /var/log/auth.log
[sshd]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
基本运行原理示意图
服务器配置
------------------------------
一个简单的静态资源服务器配置如下
------------------------------
server {
listen 80 default_server; 监听端口
server_name www.example.com; 主机名或者域名
location / {
root /usr/share/nginx/html; 匹配路径文件根目录
# alias /usr/share/nginx/html; 匹配路径别名
index index.html index.htm; 默认页名称
}
error_page 500 502 503 504 /50x.html; 报错时跳转到页面
location = /50x.html {
root html;
}
}
root指定文件系统的根目录,NGINX 会将请求的 URI 附加到 root 指定的路径后,形成完整的文件路径。
alias指定一个替代路径,NGINX 会将 location 匹配的部分替换为 alias 指定的路径。
-----------------
重要配置项解释如下
-----------------
sendfile:减少 nginx 拷贝文件、发送文件给操作系统网络接口的中间环节。
负载均衡轮循策略。
资源的动静分离。
反向代理。
Ubuntu22.04 安装开源版 Nginx
- 依次按照下面的步骤操作即可,不懂请看详细注释。
------------------
安装NGINX的具体步骤
------------------
su
apt update
apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
OS=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
RELEASE=$(lsb_release -cs)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/${OS} ${RELEASE} nginx" | tee /etc/apt/sources.list.d/nginx.list
apt update
apt install -y nginx
systemctl enable nginx
nginx
ps -ef | grep nginx
curl localhost 或者 浏览器地址栏输入localhost | curl 你的Nginx服务器IP地址
-----------------
安装命令的详细注释
-----------------
curl:用于联网下载文件。
gnupg2:用于加密和签名数据。
ca-certificates:用于验证 HTTPS 连接的安全性。
lsb-release:用于获取系统发行版信息。
debian-archive-keyring:用于验证 Debian 官方软件仓库的软件包。
curl https://nginx.org/keys/nginx_signing.key:下载 NGINX 的 GPG 签名密钥,并将其转换为适合 APT 软件包管理器使用的格式,然后保存到系统中。
gpg --dearmor:将 GPG 密钥从 ASCII 格式转换为二进制格式。
tee /usr/share/keyrings/nginx-archive-keyring.gpg:将输入内容写入文件,并同时输出到标准输出。
`>/dev/null`:将标准输出重定向到 /dev/null,即丢弃输出。
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/${OS} ${RELEASE} nginx":
该条命令的作用:生成一个包含 NGINX 软件源信息的字符串。
deb:表示这是一个 Debian 格式的软件源。
[signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]:指定用于验证软件包的 GPG 密钥文件路径。
/usr/share/keyrings/nginx-archive-keyring.gpg 是之前通过 curl 和 gpg --dearmor 下载并保存的 NGINX GPG 密钥文件。
http://nginx.org/packages/${OS} ${RELEASE} nginx:指定 NGINX 软件源的地址。
${OS}:操作系统类型(如 ubuntu 或 debian)。
${RELEASE}:操作系统的版本代号(如 focal 对应 Ubuntu 20.04,jammy 对应 Ubuntu 22.04)。
nginx:表示这是 NGINX 的软件源。
ps -ef | grep nginx:查看Nginx是否在运行。
curl ip:验证Nginx能否正常返回请求。如果在本地安装Nginx ,IP = localhost。
- 如果安装过 Nginx,请先干净彻底卸载掉 Nginx,步骤依次如下:
------------------
卸载NGINX的具体步骤
------------------
su
systemctl stop nginx
apt remove --purge nginx nginx-common nginx-core
rm -rf /etc/nginx
rm -rf /var/log/nginx
rm -rf /var/www/html/*
deluser nginx
delgroup nginx
apt autoremove
rm /etc/apt/sources.list.d/nginx.list
rm /usr/share/keyrings/nginx-archive-keyring.gpg
apt update
ps aux | grep nginx
nginx -v
ls /etc/nginx
ls /var/log/nginx
-----------------
卸载命令的详细注释
-----------------
su
systemctl stop nginx:停止 NGINX 服务。
apt remove --purge nginx nginx-common nginx-core:卸载 NGINX 软件包。
rm -rf /etc/nginx:删除配置文件目录。
rm -rf /var/log/nginx:删除日志文件。
rm -rf /var/www/html/*:删除默认的网站文件。
deluser nginx:删除 NGINX 用户。
delgroup nginx:删除 NGINX 用户。
apt autoremove:删除未使用的依赖项。
rm /etc/apt/sources.list.d/nginx.list:删除软件源文件。
rm /usr/share/keyrings/nginx-archive-keyring.gpg:删除 GPG 密钥文件。
apt update:更新软件包列表。
ps aux | grep nginx:检查 NGINX 是否仍在运行。
nginx -v:检查 NGINX 是否已卸载。
ls /etc/nginx:检查相关文件是否已删除。
ls /var/log/nginx:检查相关文件是否已删除。
Nginx 常见文件目录及配置项
/etc/nginx/:指导 nginx 如何运行的配置文件。
/etc/nginx/nginx.conf:全局配置入口点。
/etc/nginx/conf.d/:该目录存放 http 服务器的配置文件,可以通过 include 语句实现模块化引入。
-------------------------------------------
如下所示
http {
include /etc/nginx/conf.d/xxx.conf;
include ssl_conf/*.conf;
}
这样做的好处是配置实现逻辑分组,简洁有序。
-------------------------------------------
/var/log/nginx/:是 Nginx 默认日志位置。access.log 包含访问 nginx 服务的每条请求条目;
error.log 包含错误事件和调试信息。
------------------------------
举个 root 配置的例子:
------------------------------
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
如果请求的 URI 是 /index.html,NGINX 会查找文件 /usr/share/nginx/html/index.html。
如果请求的 URI 是 /images/logo.png,NGINX 会查找文件 /usr/share/nginx/html/images/logo.png。
-------------------------------
举个 alias 配置的例子:
-------------------------------
location /static/ {
alias /var/www/static/;
}
如果请求的 URI 是 /static/logo.png,NGINX 会查找文件 /var/www/static/logo.png。
location 中匹配的部分(/static/)会被替换为 alias 指定的路径(/var/www/static/)。
Nginx 常用命令
nginx -v:显示 nginx 版本。
nginx -V:显示 nginx 版本、build 信息和配置参数。
nginx -t:测试 nginx 配置是否有语法错误。
nginx -T:测试 nginx 配置并将验证后的配置打印到屏幕上。
nginx -s stop:向 nginx master 进程发送立即停止操作。
nginx -s quit:完成当前正在处理的请求后停止 nginx 进程。
nginx -s reload:重新加载配置。
nginx -s reopen:重新打开日志文件。
负载均衡基本配置
--------------------------------------
将负载分发到两台或多台 HTTP 服务器的方法
--------------------------------------
upstream backend {
server 10.10.11.35:80 weight=1 down;
server https://www.ai789.site:80 weight=2;
server www.example.com:80 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
-------------------------------------
将负载分发到两台或多台 TCP 服务器的方法
-------------------------------------
stream {
upstream mysql_cfg {
server www.example1.com:3306 weight=2;
server www.example2.com:3306;
server 10.10.11.34:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_cfg;
}
}
以上写法以模块形式引入,需要创建 /etc/nginx/stream.conf.d/mysql_cfg.conf
upstream mysql_cfg {
server www.example1.com:3306 weight=2;
server www.example2.com:3306;
server 10.10.11.34:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_cfg;
}
并在 /etc/nginx/nginx.conf 配置文件中引入
stream {
include /etc/nginx/stream.conf.d/mysql_cfg.conf;
}
-------------------------------------
将负载分发到两台或多台 UDP 服务器的方法
-------------------------------------
stream {
upstream ntp {
server ntp.example1.com:123 weight=2;
server ntp.example2.com:123;
}
server {
listen 123 udp;
proxy_pass ntp;
}
}
---------------------------------------------------------------
down:表示当前的 server 暂时不参与负载。
weight:weight值越大,负载的权重就越大。
backup:其它所有非 backup 机器 down 或者忙的时候,请求 backup 机器。
----------------------------------------------------------------
安全控制基本配置
一个完整的 Nginx 服务器配置
-------------------------------------------------
该配置适用于大多数场景,涵盖了常见的配置项和优化建议。
包括静态文件服务、反向代理、负载均衡、SSL/TLS 配置等。
-------------------------------------------------
# 全局配置块
user www-data; # 运行 Nginx 的用户
worker_processes auto; # 自动根据 CPU 核心数设置工作进程数
pid /run/nginx.pid; # PID 文件路径
include /etc/nginx/modules-enabled/*.conf; # 加载启用的模块
# 动态模块加载(示例)
load_module modules/ngx_http_brotli_filter_module.so; # Brotli 压缩模块
load_module modules/ngx_http_brotli_static_module.so; # Brotli 静态文件模块
load_module modules/ngx_http_geoip_module.so; # GeoIP 模块(用于地理位置限流)
# 事件块
events {
worker_connections 1024; # 每个工作进程的最大连接数
multi_accept on; # 允许同时接受多个连接
use epoll; # 使用高效的 epoll 事件模型(Linux)
}
# HTTP 块
http {
# 基础配置
include /etc/nginx/mime.types; # 加载 MIME 类型文件
default_type application/octet-stream; # 默认 MIME 类型
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 优化数据包发送
tcp_nodelay on; # 禁用 Nagle 算法
keepalive_timeout 65; # 保持连接的超时时间
types_hash_max_size 2048; # 类型哈希表的最大大小
# 日志配置
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; # 访问日志路径
error_log /var/log/nginx/error.log; # 错误日志路径
# Gzip 压缩配置
gzip on; # 启用 Gzip 压缩
gzip_disable "msie6"; # 禁用旧版 IE 的 Gzip
gzip_vary on; # 根据请求头启用 Vary
gzip_proxied any; # 对所有代理请求启用 Gzip
gzip_comp_level 6; # 压缩级别(1-9)
gzip_buffers 16 8k; # 压缩缓冲区
gzip_http_version 1.1; # 最低 HTTP 版本
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 压缩的文件类型
# Brotli 压缩配置(需安装 Brotli 模块)
brotli on; # 启用 Brotli 压缩
brotli_comp_level 6; # 压缩级别(1-11)
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 压缩的文件类型
# SSL 配置
ssl_protocols TLSv1.2 TLSv1.3; # 支持的 SSL 协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件
ssl_session_cache shared:SSL:10m; # SSL 会话缓存
ssl_session_timeout 10m; # SSL 会话超时时间
# 缓存优化配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; # 缓存路径和配置
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键
proxy_cache_valid 200 302 10m; # 缓存有效期
proxy_cache_valid 404 1m; # 404 缓存有效期
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 使用过期的缓存
# 限流配置
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 限流区域(10 请求/秒)
limit_conn_zone $binary_remote_addr zone=addr:10m; # 连接限制区域
# 服务器块
server {
listen 80; # 监听 HTTP 端口
server_name ai789.site www.ai789.site; # 服务器域名
# 重定向 HTTP 到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl; # 监听 HTTPS 端口
server_name ai789.site www.ai789.site; # 服务器域名
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/ai789.site.crt; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/ai789.site.key; # 私钥文件路径
# 根目录配置
root /var/www/html; # 网站根目录
index index.html index.htm; # 默认索引文件
# 静态文件服务
location / {
try_files $uri $uri/ =404; # 尝试查找文件,否则返回 404
}
# 反向代理配置
location /api/ {
proxy_pass http://backend_server; # 转发请求到后端服务器
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; # 传递转发 IP
proxy_set_header X-Forwarded-Proto $scheme; # 传递协议
# 跨域配置
add_header 'Access-Control-Allow-Origin' '*' always; # 允许所有域名跨域
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; # 允许的 HTTP 方法
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; # 允许的请求头
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; # 暴露的响应头
# 处理 OPTIONS 预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Max-Age' 1728000; # 预检请求缓存时间(20天)
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204; # 返回空响应
}
# 缓存配置
proxy_cache my_cache; # 启用缓存
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; # 绕过缓存的条件
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment; # 不缓存的条件
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头
}
# 限流配置
location /limited/ {
limit_req zone=one burst=5 nodelay; # 限流(10 请求/秒,允许突发 5 个请求)
limit_conn addr 10; # 限制每个 IP 的连接数
proxy_pass http://backend_server;
}
# 错误页面配置
error_page 404 /404.html; # 自定义 404 页面
location = /404.html {
internal; # 内部重定向
}
error_page 500 502 503 504 /50x.html; # 自定义 50x 错误页面
location = /50x.html {
internal; # 内部重定向
}
}
# 负载均衡配置
upstream backend_server {
least_conn; # 使用最少连接算法
server 192.168.1.101:8080; # 后端服务器 1
server 192.168.1.102:8080; # 后端服务器 2
server 192.168.1.103:8080 backup; # 备用服务器
}
}