Docker + Vue.js + Nginx on Vps Debian/Apache 错误 "Error during SSL Handshake with remote server"

Docker + Vue.js + Nginx on Vps Debian/Apache error "Error during SSL Handshake with remote server"

我正在尝试使用 Docker Compose 将与我的网络应用程序 (Vue.js) 相关的所有内容容器化,包括 VPS OVH Debian+ 上的 Nginx 和 SSL 证书 (Certbot)阿帕奇

我有这个错误:

“代理服务器无法处理请求

原因:与远程服务器进行 SSL 握手时出错

如果有人能指出我哪里出错了,我将不胜感激!

Docker-compose.yml

services:
  my-app-prod:
    container_name: my-app-prod
    build:
      context: .
      dockerfile: Dockerfile-prod
    ports:
      - '8080:80'
      - '4567:443'

Docker文件生产

FROM node:12.2.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json /app/package.json
RUN npm install --silent
RUN npm install @vue/cli@3.7.0 -g
COPY . /app
RUN npm run build

# production environment
FROM nginx:1.16.0-alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
EXPOSE 443
CMD ["nginx", "-g", "daemon off;"]

sites-avalaibles/nom-de-domaine.fr.conf

    ServerName nom-de-domaine.fr
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    ProxyPassReverseCookieDomain 127.0.0.1 nom-de-domaine.fr

    RewriteEngine on
    RewriteCond %{SERVER_NAME} = nom-de-domaine.fr
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

sites-avalaibles/nom-de-domaine.fr-le-ssl.conf

<VirtualHost *:443>
    ServerName nom-de-domaine.fr
   # ProxyPreserveHost On
   # SSLProxyEngine On
   # SSLProxyVerify none
   # SSLProxyCheckPeerCN off
   # SSLProxyCheckPeerName off
   # SSLProxyCheckPeerExpire off

   # SSLEngine on
    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off    

    ProxyPass / https://127.0.0.1:4567/
    ProxyPassReverse / https://127.0.0.1:4567/
    ProxyPassReverseCookieDomain 127.0.0.1 nom-de-domaine.fr

    SSLCertificateFile /etc/letsencrypt/live/ nom-de-domaine.fr /fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ nom-de-domaine.fr/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ nom-de-domaine.fr /chain.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    CustomLog "/var/log/apache2/ nom-de-domaine.fr _log" "%h %l %u %t \"%r\" %>s %b"

</VirtualHost>
</IfModule>

正如我从 post 标记和配置文件中看到的那样,您使用的是 Apache,而不是 nginx(至少在主机上)。

在主机和你的容器之间你不需要通过 ssl 的 http 因为它在本地主机 (== 127.0.0.1) 网络中,你的 ProxyPass 应该指向端口 8080,你不需要公开您容器的 443 端口。

通常这是我制作配置文件的方式:

default.conf:

<VirtualHost *:80>
    ServerName nom-de-domaine.fr

    RewriteEngine on
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

默认-le-ssl.conf:

<VirtualHost *:443>
    ServerName nom-de-domaine.fr

    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    # From certbot:
    SSLCertificateFile /etc/letsencrypt/live/nom-de-domaine.fr/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/nom-de-domaine.fr/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

端口 80 (http) 的虚拟主机仅用于永久重定向到端口 443(http 通过 ssl - https),以防止访问者通过非加密的 http 请求您的应用程序。