node.js - NGINX:使用 1 个域名为多个端口设置 SSL 证书
问题描述
我已经建立了一个使用 Rest API 来获取其所有数据的网站。我的网站受到 SSL 证书的保护。我的默认文件 ( etc/nginx/sites-enabled/default
) 如下所示:
server {
listen 80;
server_name example.com;
rewrite ^/(.*) https://example.com/$1 permanent;
}
server {
listen 443 ssl;
listen [::]:80 default_server;
root /var/www/example;
index index.html;
server_name example.com;
ssl_certificate /root/example.com.crt;
ssl_certificate_key /root/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
try_files $uri $uri/ =404;
}
}
问题是我的 Rest API(我从中获取所有数据)也必须具有 SSL 证书,才能将所有数据安全地传输到我的网站。
我在默认文件 ( etc/nginx/sites-enabled/default
) 中为其余 api 创建了另一个服务器块。它看起来像这样:
server {
listen 8877;
server_name example.com;
rewrite ^/(.*) https://example.com:8877/$1 permanent;
}
server {
listen 443 ssl;
listen [::]:8877 default_server;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name example.com;
ssl_certificate /root/example.com.crt;
ssl_certificate_key /root/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
proxy_pass http://example.com:1111;
}
}
我知道我应该像这样组合它们:
server {
listen 80ssl;
listen 8877 ssl;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
ssl_certificate /root/example.com.crt;
ssl_certificate_key /root/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
// DO SOMETHING
}
}
问题是我需要位置块在端口 80 和端口 8877 上以不同的方式运行。在端口 8877 上,位置块应该指向我在后台运行的 NodeJS 项目proxy_pass http://example.com:1111;
。在端口 80 上,它不应该指向我的 NodeJS 项目。我怎样才能做到这一点?
还是有更好的方法来实现这一点?我已经被这个问题困了2天了。购买第二个域或 SSL 证书不是一种选择 + 我的证书支持单个域上的多个端口。
解决方案
这就是我会做/尝试的:
(如果不需要,应该考虑关闭 TLS 1.0)
# General HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com default_server;
location / {
return 302 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com default_server;
root /var/www/example;
index index.html;
ssl_certificate /root/example.com.crt;
ssl_certificate_key /root/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 8877 ssl;
listen [::]:8877 ssl;
server_name example.com;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
ssl_certificate /root/example.com.crt;
ssl_certificate_key /root/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
proxy_pass http://example.com:1111;
}
}
推荐阅读
- performance - Docker 服务网络性能差
- vbscript - 在连接字符串中使用 VBScript 参数
- android - Webview 谷歌地图当前位置无法检索,打开谷歌地图应用的导航失败
- iis - 带有扩展名的 URL 上的 Sitecore 管道
- c# - UTF-8 产生问号
- python - Python 3 中的异步 for 循环
- tensorflow - 将 tf.map_fn 与多个 GPU 一起使用
- firebase - 带有 Firebase 云函数错误的 SendGrid:“套接字挂起”
- ruby-on-rails - 带有 Puma 和 Nginx 配置的调试操作电缆
- android - 使用 Android Navigation Arch 组件 (JetPack) 打开相机/图库