Nginx Reverse Proxy (Node.js/Docker) schlägt mit ERR_SSL_PROTOCOL_ERROR [geschlossen] fehlJavaScript

Javascript-Forum
Anonymous
 Nginx Reverse Proxy (Node.js/Docker) schlägt mit ERR_SSL_PROTOCOL_ERROR [geschlossen] fehl

Post by Anonymous »

Ich verwende ein mit Docker containerisiertes Node.js/Express-Backend auf einem VPS. Ich verwende Nginx als Reverse-Proxy, um die SSL-Terminierung abzuwickeln und den Datenverkehr an den Container weiterzuleiten. Obwohl alle internen Prüfungen erfolgreich verlaufen, schlägt der externe Zugriff immer wieder mit einem browserseitigen ERR_SSL_PROTOCOL_ERROR fehl. Der Nginx-Reverse-Proxy (Node.js/Docker) schlägt extern mit ERR_SSL_PROTOCOL_ERROR fehl, funktioniert aber intern auf dem VPS.
Ich benötige Hilfe bei der Identifizierung, wo der Handshake zwischen dem Client, Nginx und der Docker-Netzwerkbrücke unterbrochen wird.
Meine Anwendung wird über eine GitHub-Aktionspipeline auf einem Remote-Ubuntu-VPS bereitgestellt.
Backend-Anwendung: Node.js/Express läuft auf Port 4000.
Containerisierung: Docker (wird dem Host-Port 4000 zugeordnet).
Webserver: Nginx (läuft auf dem Host) verarbeitet Port 443 (HTTPS) und Proxys für http://localhost:4000.
SSL: Gültiges Let's Encrypt-Zertifikat ist auf Nginx installiert.
Symptome und Diagnose
Externer Fehler: Der Besuch von https://api.anexiums.com schlägt in allen externen Browsern mit ERR_SSL_PROTOCOL_ERROR (oder „Die Website kann keine sichere Verbindung bereitstellen“) fehl.
Interner Erfolg (kritischer Hinweis): Curl wird ausgeführt -I https://api.anexiums.com direkt von der VPS-SSH-Konsole gibt HTTP/1.1 200 OK zurück. Dies beweist, dass Nginx das SSL-Zertifikat korrekt liest und die Anfrage erfolgreich an den Docker-Container weiterleitet.
Ports/Firewall: Bestätigt, dass Nginx Port 443 überwacht und UFW Port 443-Verkehr zulässt.
Konfigurationsdatei

Code: Select all

server {
listen 80;
listen [::]:80;
server_name api.anexiums.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name api.anexiums.com;

ssl_certificate /etc/letsencrypt/live/api.anexiums.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.anexiums.com/privkey.pem;

include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

location / {
proxy_pass http://localhost:4000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
docker-compose.yml

Code: Select all

version: "3"
services:
backend:
build: .
container_name: anexiums-backend
ports:
- "4000:4000"
restart: unless-stopped
Docker-Datei

Code: Select all

    FROM node:20-alpine

# Install OpenSSL and update CA certificates
RUN apk add --no-cache openssl ca-certificates && \
update-ca-certificates

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY .  .

RUN npx tsc

EXPOSE 4000

USER node

CMD ["node", "lib/src/index.js"]
deploy.yml

Code: Select all

name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
JWT_SECRET: ${{ secrets.JWT_SECRET }}
MONGODB_URL: ${{ secrets.MONGODB_URL }}
PORT: 4000
NODE_ENV: development
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 20
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build Docker image
run: |
docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/anexiums-backend:latest -f Dockerfile .
echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker push ${{ secrets.DOCKERHUB_USERNAME }}/anexiums-backend:latest
- name: Log in to VPS via SSH and deploy
uses: appleboy/[email protected]
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
script: |
cd /var/www/AneXiums-Backend
# Stop the Node.js process using port 4000
sudo pkill -f "node.*4000" || true
sleep 2  # Wait for process to fully stop
# Stop and remove old container
docker stop anexiums-backend || true
docker rm anexiums-backend || true

# Log in and pull the latest Docker image from Docker Hub
docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" -p "${{ secrets.DOCKERHUB_TOKEN }}"
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/anexiums-backend:latest

# Run the container using the pulled image
docker run -d -p 4000:4000 --name anexiums-backend --env-file .env ${{ secrets.DOCKERHUB_USERNAME }}/anexiums-backend:latest

echo "✅ Deployment completed successfully!"
Da die SSL/Proxy-Kette intern als betriebsbereit bestätigt wird (Server -> Nginx -> Docker -> Nginx -> Server-CLI), muss der Fehler während des SSL-Handshakes des externen Clients mit der Nginx-Hostschnittstelle auftreten.
Was könnte dazu führen, dass die Nginx/Host OS/Docker-Netzwerkbrückenschnittstelle den SSL-Handshake für externe Clients vorzeitig beendet, was zu ERR_SSL_PROTOCOL_ERROR führt, während dies zulässig ist? Wird der Handshake für den lokalen Curl-Client erfolgreich abgeschlossen?
(Ich habe den Ablauf des Zertifikats, Firewall-Probleme bei UFW und lokales Browser-Caching ausgeschlossen.)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post