我有一个docker基础设施,包括
1 nginx 反向代理 1 nginx web 服务器 1 php7.0 fpm 服务器
nginx 反向代理和 web 服务器都使用相同的 docker 镜像,但只是加载了不同的站点配置。
在反向代理上,它还提供静态 javascript SPA 以及向为我的 api 提供服务的 Web 服务器进行反向代理。
因此两个 nginx 容器都运行相同的 /etc/nginx/nginx.conf
我的 SSL 配置如下
##
# SSL Settings
##
ssl_stapling off;
ssl_session_timeout 1h;
ssl_session_tickets off;
ssl_stapling_verify off;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
ssl_certificate /srv/ssl/nginx-selfsigned.crt;
ssl_certificate_key /srv/ssl/nginx-selfsigned.key;
ssl_dhparam /srv/ssl/dhparam.pem;
我网站的反向代理配置如下
server {
listen 1025 ssl http2;
listen [::]:1025 ssl http2;
server_name api.site.com;
location / {
#include /etc/nginx/naxsi.rules;
proxy_pass https://td-api:1025;
proxy_buffering on;
proxy_buffers 256 16k;
proxy_buffer_size 128k;
proxy_read_timeout 300;
proxy_intercept_errors on;
proxy_max_temp_file_size 0;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我的 spa 网站配置是
server {
listen 1025 ssl http2;
listen [::]:1025 ssl http2;
server_name site.network;
root /srv/agentfree-client/dist;
limit_conn addr 10;
limit_req zone=one burst=15 nodelay;
index index.html;
autoindex off;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.html break;
}
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
我的 api web 服务器的 nginx 配置是
server {
listen 1025 ssl http2 default_server;
listen [::]:1025 ssl http2 default_server;
index index.php;
root /srv/www/public;
server_name api.site.com;
limit_conn addr 10;
limit_req zone=one burst=15 nodelay;
location / {
#include /etc/nginx/naxsi.rules;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass td-api-fpm:9000;
}
}
我的 SSL 是自签名的,生成方式如下
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /srv/ssl/nginx-selfsigned.key -out /srv/ssl/nginx-selfsigned.crt
openssl dhparam -out /srv/ssl/dhparam.pem 2048
在此之前,我先在完整模式下运行 cloudflare ssl,并关闭 tls1.3 beta
当我加载静态网站时,我得到了我的网站和一个漂亮的绿色 https 在 chrome 中
当我尝试在我的 api 中点击路由时,出现了这个错误
此网站无法提供安全连接
api.site.com 使用了不受支持的协议。ERR_SSL_VERSION_OR_CIPHER_MISMATCH 隐藏详细信息 不支持的协议 客户端和服务器不支持通用 SSL 协议版本或密码套件。
我在 ubuntu 16.10 上,docker 容器运行 16.10,我在 chrome 57.0.2987.110(官方版本)(64 位)中得到了这个,我也在同一台机器和 ipad 上的 Firefox 中进行了测试。
如果我绕过 cloudflare 的 api url,我的网站就可以加载,尽管会出现自签名 ssl 警告。
有人能解释为什么会发生这种情况吗,我正在为多个应用程序运行这个精确的设置,没有问题,但这个 api 服务器让我抓狂
答案1
事实证明,免费计划中无法使用带有 SSL 的多级子域名