我为我的电子邮件服务器找到了这个docker解决方案https://mailcow.email/。此解决方案包含一个 Web 面板和 certbot。我想要做的是使用 proxypass两个都http 和 https 连接到 nginx docker 镜像,该镜像已为 http 和 https 处理设置了一切。换句话说,我想要:
- 内部 certbot 能够更新内部证书
- 如果 https 连接到达我的服务器,则让 docker 镜像处理它
- 如果收到 http 请求并且不是 letsencrypt 更新强制转为 https
到目前为止我尝试的是进行以下配置:
server {
listen 80;
server_name mail.example.com;
#rewrite ^ https://$server_name$request_uri? permanent;
location /.well-known/acme-challenge {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
location / {
proxy_pass http://127.0.0.1:8443/;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
}
但没有成功。我可以连接到https://example.com:8443但不是https://example.com。但是,当收到 http 请求时,我设法重定向到 https,结果我的浏览器无法连接。
我想要代理的docker镜像是:
2daeaa065165 nginx:mainline-alpine "/bin/sh -c 'envsu..." 56 minutes ago Up 56 minutes (healthy) 0.0.0.0:8080->8080/tcp, 80/tcp, 0.0.0.0:8443
它监听端口 8080 的 http 连接和端口 8443 的 https 连接。
你们知道我该如何解决这个问题吗?
编辑1:
我把配置改成:
server {
listen 80;
server_name mail.example.com;
location /.well-known/acme-challenge {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
location / {
rewrite ^(.*) https://$server_name$1 permanent;
}
}
server {
listen 443;
server_name mail.example.com;
ssl_certificate /opt/docker-mailcow/data/assets/ssl/cert.pem;
ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
}
浏览器返回以下消息:
连接到 mail.thundermail.ml 时发生错误。SSL 收到的记录超出了最大允许长度。错误代码:SSL_ERROR_RX_RECORD_TOO_LONG
这些密钥还具有以下权限:
pcmagas@DockerMailserver:/opt/docker-mailcow/data/assets/ssl$ ls -l
σύνολο 24
drwxr-xr-x 3 root root 4096 Ιούν 23 20:35 acme
-rw-r--r-- 1 pcmagas pcmagas 1675 Ιούν 23 19:49 ca-key.pem
-rw-r--r-- 1 pcmagas pcmagas 1034 Ιούν 23 19:49 ca.pem
-rw-r--r-- 1 pcmagas pcmagas 1107 Ιούν 23 19:49 cert.pem
-rw-r--r-- 1 pcmagas pcmagas 424 Ιούν 23 19:49 dhparams.pem
-rw-r--r-- 1 pcmagas pcmagas 1679 Ιούν 23 19:49 key.pem
答案1
只需将 nginx 配置更改为:
server {
listen 80;
server_name mail.example.com;
location /.well-known {
proxy_pass http://127.0.0.1:8080/.well-known ;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
location / {
rewrite ^(.*) https://$server_name$1 permanent;
}
}
server {
listen 443 ssl;
server_name mail.example.com;
ssl_certificate /opt/docker-mailcow/data/assets/ssl/cert.pem;
ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $http_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;
client_max_body_size 100m;
}
}
其中ssl_certificate
和ssl_certificate_key
指向一个文件,该文件是acme-mailcow
docker 镜像卷生成证书的目录。
请记住设置ADDITIONAL_SAN
您MAILCOW_HOSTNAME
的邮件服务器的正确 MX 记录。
还要mail.example.com
用您自己的 MX 记录替换(在我的情况下应该与 A 记录相同)。