Nginx Proxy Manager (NPM) 是一个基于Nginx的图形化管理工具,允许用户通过Web界面轻松配置反向代理、SSL证书和访问控制,而无需直接编辑Nginx配置文件。
docker run -d \
--name=nginx-proxy-manager \
-p 80:80 \
-p 81:81 \
-p 443:443 \
-v /path/to/data:/data \
-v /path/to/letsencrypt:/etc/letsencrypt \
--restart unless-stopped \
jc21/nginx-proxy-manager:latest
端口映射:
数据卷:
/data
: 存储NPM的数据库和配置文件/etc/letsencrypt
: 存储SSL证书在NPM管理界面中添加代理主机时,可以通过"Advanced"选项卡添加自定义Nginx配置:
# 示例:优化代理性能
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;
# 连接优化
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_request_buffering off;
NPM支持基本的负载均衡功能:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 负载均衡策略
least_conn; # 最少连接数
# 或
# ip_hash; # IP哈希
}
server {
location / {
proxy_pass http://backend;
}
}
# 在Advanced配置中添加
proxy_cache_path /tmp/nginx-cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Proxy-Cache $upstream_cache_status;
}
}
默认SQLite适合小型部署,对于高流量环境建议切换到MySQL/MariaDB:
config.json
文件:{
"database": {
"engine": "mysql",
"host": "db",
"name": "npm",
"user": "npm",
"password": "your_secure_password",
"port": 3306
}
}
/app/config
目录编辑NPM的Nginx模板(位于/data/nginx/templates/
),调整以下参数:
worker_processes auto; # 根据CPU核心数自动调整
worker_rlimit_nofile 40000; # 每个worker进程的最大文件描述符数
events {
worker_connections 10000; # 每个worker的最大连接数
use epoll; # Linux系统使用epoll事件模型
multi_accept on; # 同时接受多个连接
}
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_stapling on;
ssl_stapling_verify on;
管理界面安全:
代理访问控制:
在"Advanced"配置中添加:
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 防止XSS攻击
add_header X-XSS-Protection "1; mode=block";
# 内容安全策略
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; style-src 'self' 'unsafe-inline';";
# 限制HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 限制请求大小
client_max_body_size 10m;
client_body_buffer_size 128k;
# 在Advanced配置中自定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main buffer=32k flush=5m;
error_log /var/log/nginx/error.log warn;
Prometheus + Grafana:
nginx-prometheus-exporter
收集指标日志分析:
可能原因及解决方案:
- 后端服务不可用 → 检查后端服务状态
- 代理超时设置过短 → 增加proxy_read_timeout
- DNS解析问题 → 在代理主机配置中使用IP而非域名
.well-known
路径可访问Content-Security-Policy
头/data/nginx/templates/default.conf.template
)通过不同子域名或路径隔离不同用户的代理配置:
server {
server_name tenant1.yourdomain.com;
# 租户1特定配置
}
server {
server_name tenant2.yourdomain.com;
# 租户2特定配置
}
确保代理配置中包含:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 长连接超时
通过以上配置和优化,您可以充分发挥Nginx Proxy Manager的潜力,构建高性能、安全可靠的反向代理服务。