目录
[Nginx 简介](#Nginx 简介)
[Nginx 的特点和优势](#Nginx 的特点和优势)
[安装 Nginx](#安装 Nginx)
[在 Windows 上安装 Nginx](#在 Windows 上安装 Nginx)
[在 Linux (CentOS)上安装 Nginx](#在 Linux (CentOS)上安装 Nginx)
[Nginx 配置文件结构](#Nginx 配置文件结构)
[启动、停止和重载 Nginx](#启动、停止和重载 Nginx)
[配置 MIME 类型](#配置 MIME 类型)
[SSL/TLS 配置](#SSL/TLS 配置)
[获取 SSL 证书](#获取 SSL 证书)
[配置 HTTPS](#配置 HTTPS)
[强制 HTTPS 重定向](#强制 HTTPS 重定向)
[IP 地址白名单和黑名单](#IP 地址白名单和黑名单)
[IP 地址白名单](#IP 地址白名单)
[IP 地址黑名单](#IP 地址黑名单)
[基于请求的 URI 访问控制](#基于请求的 URI 访问控制)
[Gzip 压缩](#Gzip 压缩)
[Keep-Alive 设置](#Keep-Alive 设置)
[防止 DDoS 攻击](#防止 DDoS 攻击)
[使用 HTTPS](#使用 HTTPS)
[定期更新 Nginx](#定期更新 Nginx)
引言
### Nginx 简介
* Nginx最初由 Igor Sysoev 开发,旨在解决 C10K 问题,即如何在单台服务器上同时处理一万多个并发连接。Nginx 采用事件驱动架构,相比传统的线程或进程模型,能够更有效地利用系统资源,实现高并发处理。
### Nginx 的特点和优势
* **高并发处理**:使用事件驱动模型,能够处理大量并发连接,适合高流量网站。
* **低内存消耗**:相比其他服务器,Nginx 的内存占用较低,适合资源有限的环境。
* **反向代理和负载均衡**:支持多种负载均衡算法,能够将请求分发到多个后端服务器,提升网站的可用性和响应速度。
* **灵活的配置**:通过配置文件,用户可以轻松地定制 Nginx 的行为,满足不同需求。
* **静态文件处理**:对于静态文件,Nginx 的处理速度非常快,适合用作静态资源的服务器。
* **安全性**:支持 SSL/TLS 加密和防止 DDoS 攻击,增强网站的安全性。
### 适用场景
* **反向代理服务器**:将请求转发到后端服务器(如应用服务器),以实现负载均衡和提高安全性。
* **负载均衡**:支持多种负载均衡算法(如轮询、IP 哈希等),可以将流量分配到多台后端服务器,提高系统的可用性和性能。
* **静态文件服务**:能够高效地提供静态资源(如图片、CSS、JavaScript 等),通常性能优于传统的应用服务器。
* **SSL/TLS 终端**:处理 HTTPS 请求,卸载加密和解密的负担,减轻后端服务器的压力。
* **内容缓存**:可以缓存静态和动态内容,提高访问速度,减少后端负载。
* **API 网关**:适用于微服务架构,作为 API 请求的入口,进行流量管理、认证和监控。
* **WebSocket 代理**:支持 WebSocket 协议,适合需要实时通信的应用。
* **HTTP/2 支持**:支持 HTTP/2 协议,提升网站的加载速度和用户体验。
安装 Nginx
### 在 Windows 上安装 Nginx
* **下载 Nginx**:
* 访问 [nginx: download](https://nginx.org/en/download.html "nginx: download")
* 下载适合 Windows 的最新版本(通常是 `.zip` 文件)。
* ![](https://i-blog.csdnimg.cn/direct/f7017d73086345b5b7177d5b0b024a0e.png)
* **解压缩**:
* 将下载的 `.zip` 文件解压到您希望安装 Nginx 的目录(例如 D`:\nginx`)。
* **运行 Nginx**:
* 打开命令提示符(cmd)。
* 进入 Nginx 的安装目录:
*
start nginx
* **验证安装**:
* 在浏览器中访问 [http://127.0.0.1:80/](http://127.0.0.1/ "http://127.0.0.1:80/"),如果看到 Nginx 欢迎页面,则安装成功。
* ![](https://i-blog.csdnimg.cn/direct/1b88379f2fb3444e930e060c4437d289.png)
* **停止 Nginx**:
* 在命令提示符中输入:(然后刷新浏览器就访问不到了)
*
nginx -s stop
### 在 Linux (CentOS)上安装 Nginx
* **安装 EPEL 仓库** (Nginx 在 EPEL 中可用):
*
sudo yum install epel-release -y
* **安装 Nginx** :
*
sudo yum install nginx -y
* **启动 Nginx 服务** :
*
sudo systemctl start nginx
* **设置 Nginx 开机自启动** :
*
sudo systemctl enable nginx
* **检查 Nginx 是否运行** :
*
sudo systemctl status nginx
![](https://i-blog.csdnimg.cn/direct/e3ebc4f6418c45749db112f6e40246e1.png)
* **打开浏览器,访问127.0.0.1**
* ![](https://i-blog.csdnimg.cn/direct/2474208abb244a3a8656815dca7418eb.png)
* **要关闭 Nginx 服务**
*
sudo systemctl stop nginx
* **用 Nginx 的开机自启动**
*
sudo systemctl disable nginx
基本配置
### Nginx 配置文件结构
* ![](https://i-blog.csdnimg.cn/direct/4ee0cf2a39be4bf8aa1fe70b12d1ec51.png)
* ![](https://i-blog.csdnimg.cn/direct/4188394282ab461e9fcd352510033b61.png)
*
user nginx; # 指定 Nginx 运行的用户
worker_processes auto; # 自动设置工作进程数
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
http {
include mime.types; # 包含 MIME 类型文件
default_type application/octet-stream;
sendfile on; # 启用高效文件传输
keepalive_timeout 65; # 设置保持连接的超时时间
# 定义服务器块
server {
listen 80; # 监听的端口
server_name localhost; # 服务器名
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
}
}
}
### 启动、停止和重载 Nginx
*
sudo systemctl start nginx //启动
sudo systemctl stop nginx //停止
sudo systemctl reload nginx //重新加载
sudo systemctl status nginx //连接状态
#windows 重新加载
nginx -s reload
### 基本的服务器块配置
*
server {
listen 80; # 监听 HTTP 请求
server_name example.com www.example.com; # 服务器名
location / {
root /var/www/html; # 网站根目录
index index.html index.htm; # 默认首页
}
location /images/ {
root /var/www; # 指定子目录
}
# 错误页面配置
error_page 404 /404.html;
location = /404.html {
internal;
}
# 反向代理示例
location /api/ {
proxy_pass http://backend_server; # 代理到后端服务器
}
}
处理静态文件
### 设置文档根目录
* 在 Nginx 中,可以通过 `root` 或 `alias` 指令设置文档根目录。假设你希望将文档根目录设置为 `D:/tu`,你可以这样配置:
*
server {
listen 8072;
server_name localhost;
location / {
root D:/tu; # 设置文档根目录
index index.html; # 默认首页文件
}
}
### 配置 MIME 类型
* Nginx 默认会加载 `mime.types` 文件来设置 MIME 类型。如果你需要为特定文件类型设置 MIME 类型,可以在 `http` 块中进行配置。例如:
*
http {
include mime.types; # 加载 MIME 类型配置
default_type application/octet-stream;
# 其他配置...
}
* 你可以在 `mime.types` 文件中找到常见文件扩展名的 MIME 类型,如下所示:
text/html html htm;
text/css css;
text/javascript js;
image/jpeg jpg jpeg;
image/png png;
### 优化静态文件服务
* **启用 `sendfile`** :可以提高文件传输性能。
*
sendfile on; # 启用高效文件传输
* **使用 `gzip` 压缩**:可以减少传输数据的大小。
*
gzip on; # 启用 gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
* **设置缓存**:为静态文件设置合理的缓存策略。
*
location / {
expires 30d; # 设置文件过期时间为30天
}
反向代理
### 反向代理概述
* **反向代理** 是一种服务器,客户端请求不直接发送到目标服务器,而是发送到反向代理服务器。反向代理服务器接收请求,然后将其转发到适当的后端服务器。后端服务器的响应会通过反向代理返回给客户端。
*
##### 反向代理的优点:
* **安全性**:隐藏后端服务器的真实地址,增强安全性。
* **负载均衡**:可以将请求分配到多台后端服务器,以实现负载均衡,提高性能。
* **缓存**:反向代理可以缓存后端服务器的响应,减少对后端的请求压力。
* **SSL 终止**:可以在反向代理服务器上处理 SSL 加密,简化后端服务器的配置。
### 配置反向代理服务器
*
server {
listen 80; # 监听 80 端口
server_name zbr.com; # 你的服务器域名或 IP 地址
location /ceshi {
proxy_pass http://192.68.1.11:7862; # 将请求转发到目标服务
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; # 添加 X-Forwarded-For 头
proxy_set_header X-Forwarded-Proto $scheme; # 添加协议头
}
}
### 负载均衡基本配置
*
http {
upstream backend_servers {
server backend1.example.com; # 第一台后端服务器
server backend2.example.com; # 第二台后端服务器
server backend3.example.com; # 第三台后端服务器
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到负载均衡集群
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;
}
}
}
##### 负载均衡算法
* **轮询(默认)**:按顺序将请求分配到每台后端服务器。
* **权重**:根据权重将请求分配到后端服务器。配置示例:
*
upstream backend_servers {
server backend1.example.com weight=3; # 权重为 3
server backend2.example.com weight=1; # 权重为 1
}
* **IP 哈希**:根据客户端 IP 地址将请求分配到特定后端服务器。配置示例:
*
upstream backend_servers {
ip_hash; # 启用 IP 哈希
server backend1.example.com;
server backend2.example.com;
}
SSL/TLS 配置
### 获取 SSL 证书
* 网上买一个
### 配置 HTTPS
*
server {
listen 443 ssl; # 启用 SSL
server_name example.com www.example.com; # 你的域名
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL 证书路径
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 私钥路径
# 强化 SSL 配置(可选)
ssl_protocols TLSv1.2 TLSv1.3; # 启用 TLS 版本
ssl_ciphers 'HIGH:!aNULL:!MD5'; # 设置密码套件
location / {
# 你的其他配置...
}
}
### 强制 HTTPS 重定向
* 如果你希望将所有 HTTP 请求重定向到 HTTPS,可以添加一个新的 server 块来处理 80 端口的请求:
*
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri; # 强制重定向到 HTTPS
}
### 完整配置示例
*
# 强制 HTTP 到 HTTPS 重定向
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri; # 强制重定向到 HTTPS
}
# HTTPS 配置
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL 证书路径
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 私钥路径
# 强化 SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'HIGH:!aNULL:!MD5';
location / {
# 你的其他配置...
}
}
访问控制
### IP 地址白名单和黑名单
*
##### IP 地址白名单
server {
listen 80;
server_name example.com;
location / {
allow 192.168.1.100; # 允许的 IP 地址
allow 192.168.1.101; # 另一个允许的 IP 地址
deny all; # 拒绝其他所有访问
}
}
##### IP 地址黑名单
*
server {
listen 80;
server_name example.com;
location / {
deny 192.168.1.200; # 拒绝的 IP 地址
deny 192.168.1.201; # 另一个拒绝的 IP 地址
allow all; # 允许其他所有访问
}
}
### 基于请求的访问控制
*
##### 基于请求的 URI 访问控制
*
server {
listen 80;
server_name example.com;
location /admin {
allow 192.168.1.100; # 仅允许特定 IP 地址访问
deny all; # 拒绝其他访问
}
}
*
##### 基于请求方法的访问控制
*
server {
listen 80;
server_name example.com;
location /api {
limit_except GET {
deny all; # 只允许 GET 请求,拒绝其他方法
}
}
}
日志管理
### 配置访问日志和错误日志
*
##### 访问日志
*
Nginx 默认会记录访问日志,可以在 http 或 server 块中进行配置。例如:
http {
access_log /var/log/nginx/access.log; # 访问日志文件路径
# 其他配置...
}
*
##### 错误日志
*
错误日志的配置类似,可以在 http 或 server 块中进行配置:
http {
error_log /var/log/nginx/error.log; # 错误日志文件路径
error_log /var/log/nginx/error.log warn; # 设置日志级别为 warn
# 其他配置...
}
### 日志格式定制
*
http {
log_format custom_format '$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 custom_format; # 使用自定义格式
}
* `$remote_addr`:客户端 IP 地址
* `$remote_user`:用户认证信息
* `$time_local`:访问时间
* `$request`:请求行
* `$status`:HTTP 状态码
* `$body_bytes_sent`:发送的字节数
* `$http_referer`:来源地址
* `$http_user_agent`:客户端用户代理
* `$http_x_forwarded_for`:转发的客户端 IP(如果存在)
### 日志分析工具
* GoAccess
* AWStats
性能优化
### 缓存配置
* 静态文件缓存
* 可以通过 `expires` 指令配置静态文件的缓存时间。例如,设置缓存图片、CSS 和 JS 文件:
location / {
expires 30d; # 缓存 30 天
add_header Cache-Control "public, max-age=2592000"; # 设置 Cache-Control 头
}
* 代理缓存
* 如果 Nginx 作为反向代理,你可以配置代理缓存来提高性能:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://backend_server;
proxy_cache my_cache; # 启用代理缓存
proxy_cache_valid 200 60m; # 缓存 200 响应 60 分钟
}
}
}
### Gzip 压缩
* 启用 Gzip 压缩可以减少传输数据的大小,提高网站加载速度。可以在 `http` 块中配置:
http {
gzip on; # 启用 Gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 压缩的 MIME 类型
gzip_min_length 1000; # 最小压缩长度
gzip_vary on; # 支持代理缓存
}
### Keep-Alive 设置
* Keep-Alive 允许客户端与服务器之间保持持久连接,减少重复连接的开销。可以在 `http` 块中配置:
*
http {
keepalive_timeout 65; # 设置 Keep-Alive 超时时间
keepalive_requests 100; # 最大请求数
}
安全性
### 基本安全配置
* 关闭不必要的 HTTP 方法
*
server {
listen 80;
server_name example.com;
location / {
limit_except GET POST {
deny all; # 只允许 GET 和 POST 方法
}
}
}
* 隐藏 Nginx 版本信息
*
http {
server_tokens off; # 隐藏版本信息
}
* 限制请求速率
*
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 每个 IP 每秒最多 1 个请求
server {
listen 80;
server_name example.com;
location / {
limit_req zone=one burst=5; # 突发请求数为 5
# 其他配置...
}
}
}
### 防止 DDoS 攻击
* 使用防火墙
* 使用 Nginx 的限制模块
*
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; # 每个 IP 地址的连接数限制
server {
listen 80;
server_name example.com;
location / {
limit_conn addr 10; # 每个 IP 地址最多 10 个连接
# 其他配置...
}
}
}
### 安全性最佳实践
*
##### 使用 HTTPS
强烈建议使用 SSL/TLS 来加密数据传输,保护用户信息。参考之前的 SSL/TLS 配置。
##### 定期更新 Nginx
确保 Nginx 和操作系统保持最新,及时修补已知的安全漏洞。
##### 限制访问控制
使用 IP 白名单和黑名单来限制访问敏感区域,例如管理面板。
##### 使用安全的文件权限
确保 Nginx 配置文件和相关目录的权限设置正确,避免未授权访问。
##### 定期检查日志
定期检查 Nginx 访问日志和错误日志,发现异常活动并采取相应措施。
常见问题与故障排除
### 常见错误代码及其含义
* **400 Bad Request**: 客户端请求无效,可能是请求语法错误或请求数据缺失。
* **401 Unauthorized**: 请求需要身份验证,客户端未提供有效的凭证。
* **403 Forbidden**: 服务器拒绝请求,可能是由于权限设置或文件/目录的访问控制。
* **404 Not Found**: 请求的资源未找到,可能是 URL 错误或文件不存在。
* **405 Method Not Allowed**: 请求方法不被允许,可能是服务器配置错误。
* **500 Internal Server Error**: 服务器内部错误,通常是代码或配置问题。
* **502 Bad Gateway**: Nginx 作为反向代理时,后端服务器不可用或返回错误。
* **504 Gateway Timeout**: Nginx 作为反向代理时,后端服务器超时未响应。
### 解决常见配置问题
* 检查 Nginx 配置文件
*
nginx -t
* 查看错误日志
* 配置文件的正确缩进
* 确保配置文件的格式和缩进正确,尤其是在 `server`、`location` 块中。
* 资源路径问题
* 确保静态文件和资源的路径正确配置,使用绝对路径时要注意格式和拼写。
### 调试技巧
* 使用 Nginx 的调试日志
*
error_log /var/log/nginx/error.log debug;
* 清理缓存
* 测试不同配置
* 在调试时,可以逐步注释掉部分配置,查看问题是否得到解决。
案例:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/', methods=['GET'])
def success():
return jsonify({"port+": "9082"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9082) # 监听所有可用的接口,端口
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream flask_app {
server 127.0.0.1:9081; # 第一个后端服务
server 127.0.0.1:9082; # 第二个后端服务
}
server {
listen 8072;
server_name localhost;
location / {
proxy_pass http://flask_app; # 使用 upstream 组
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root D:/tu/nginx-1.26.2/nginx-1.26.2/html; # 确保路径正确
}
}
}
这样 你每次 刷新浏览器 就会在不同程序上返回了