Nginx配置指南:支持多域名HTTPS和proxy_protocol协议
引言 在当今的web服务架构中,Nginx作为一个强大的web服务器和反向代理服务器,扮演着至关重要的角色。本文将详细介绍如何配置Nginx以支持多域名HTTPS和代理协议,涵盖了几种常见的场景。我们将从基本的配置开始,逐步深入到更复杂的设置。
场景1:多域名HTTPS和SNI
首先,让我们看看如何配置Nginx来支持多个HTTPS域名,并使用SNI(服务器名称指示)将流量路由到不同的后端服务器。
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$ssl_preread_server_name"';
access_log /var/log/nginx/stream-access.log basic;
error_log /var/log/nginx/stream-error.log;
map $ssl_preread_server_name $backend_name {
example1.com backend1;
example2.com backend2;
default backend_default;
}
upstream backend1 {
server 192.168.1.10:443;
}
upstream backend2 {
server 192.168.1.20:443;
}
upstream backend_default {
server 192.168.1.30:443;
}
server {
listen 443;
proxy_pass $backend_name;
ssl_preread on;
proxy_protocol on;
}
} 这个配置的主要特点:
使用stream模块处理TCP流量。 定义自定义日志格式,包含SNI信息。 使用map指令根据SNI选择后端服务器。 配置多个上游服务器组。 在服务器块中启用SSL预读和代理协议。
场景2:后端Nginx HTTPS服务器配置
当后端服务器也使用Nginx时,我们需要配置它来处理HTTPS请求并支持代理协议。以下是一个示例配置:
http {
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;
set_real_ip_from 192.168.1.0/24;
real_ip_header proxy_protocol;
server {
listen 443 ssl proxy_protocol;
server_name example1.com;
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/privkey.pem;
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;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
root /var/www/example1.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
} 这个配置的主要特点:
启用代理协议以获取真实客户端IP。 配置SSL证书和安全选项。 添加安全相关的HTTP头。 设置网站根目录和默认文件。
场景3:后端HTTP服务代理
有时,后端服务可能运行在HTTP上,而我们希望在前端提供HTTPS。以下是如何配置Nginx作为SSL终止代理:
http {
# ... 之前的日志和IP配置 ...
upstream backend {
server 127.0.0.1:8200;
}
server {
listen 443 ssl proxy_protocol;
server_name example1.com;
# ... SSL配置和安全头部 ...
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;
}
}
} 这个配置将HTTPS请求转发到本地运行的HTTP服务,同时保留客户端信息。
场景4:处理不支持代理协议的后端HTTPS服务
最后,让我们看看如何处理前端使用代理协议,但后端HTTPS服务不支持代理协议的情况:
stream {
# ... 之前的日志配置 ...
upstream backend_with_proxy_protocol {
server 127.0.0.1:8443;
}
upstream real_backend {
server 192.168.1.10:443;
}
server {
listen 443;
proxy_pass backend_with_proxy_protocol;
ssl_preread on;
proxy_protocol on;
}
server {
listen 8443 proxy_protocol;
proxy_pass real_backend;
}
} 这个配置创建了一个中间层,它接收带有代理协议的连接,然后将纯HTTPS流量转发给后端服务。
结论
通过这些配置示例,我们展示了Nginx在处理HTTPS流量、支持多域名、使用代理协议以及作为SSL终止代理方面的灵活性。根据您的具体需求,您可以混合和匹配这些配置来创建适合您的架构的设置。
记住,在应用这些配置时,始终要根据您的实际环境调整IP地址、域名和证书路径。此外,定期更新Nginx和SSL证书,并关注最新的安全最佳实践,以确保您的服务器配置始终安全和高效。