WordPress im Docker-Container hinter dem Nginx-Proxy mit SSL

Lesezeit: 4 Minuten

Benutzer-Avatar
Mayous

Ich habe ein Problem mit meiner Serverkonfiguration und kann nicht herausfinden, was ich falsch mache.

Also habe ich einen Nginx-Proxy wie diesen:

server {
    listen *:443 ssl;
    ssl_certificate /root/software/keys/mywebsite.keys/mywebsite.crt;
    ssl_certificate_key /root/software/keys/mywebsite.keys/mywebsite.key;

    server_name www.mywebsite.com mywebsite.com;

    access_log /var/log/nginx/mywebsite.access.log;
    error_log /var/log/nginx/mywebsite.error.log;

    root /srv/new-website;
    index index.html index.htm index.php;

    location  / {
        proxy_redirect          off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        client_body_buffer_size 128k;
        proxy_connect_timeout   90;
        proxy_send_timeout      90;
        proxy_read_timeout      90;
        proxy_buffers           32 4k;
        proxy_set_header X-Forwarded-Proto https;
        proxy_pass http://127.0.0.1:8082;
    }
}

Mein Container lauscht auf Port 8082 in meiner docker-compose.yml-Datei:

version: '2'

services:
    websites:
        build: 
            context: ./dockerfiles/                                        
            args:                                                                      
                MYSQL_ROOT_PASSWORD: MyPassword
        volumes:
            - ./logs:/var/log
            - ./html:/var/www
            - ./mysql-data:/var/lib/mysql
        ports:
            - "8082:80"

In meinem Container installiere ich nginx mit dieser Konfiguration:

server {
    listen *:80;

    server_name www.mywebsite.com mywebsite.com;

    access_log /var/log/nginx/mywebsite.access.log;
    error_log /var/log/nginx/mywebsite.error.log;

    root /var/www/mywebsite;
    index index.html index.htm index.php;

    # WordPress single blog rules.
    # Designed to be included in any server {} block.

    # Uncomment the code below to use htpasswd authentication
    #location ~* (wp-login)\.php$ {
    #    auth_basic            "Administrator Login";
    #    auth_basic_user_file  /full/path/to/.htpasswd;
    #}

    # This order might seem weird - this is attempted to match last if rules below fail.
    # http://wiki.nginx.org/HttpCoreModule
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # Add trailing slash to */wp-admin requests.
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # Directives to send expires headers and turn off 404 error logging.
    location ~* ^.+\.    (ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
    }

    # Uncomment one of the lines below for the appropriate caching plugin (if used).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    location ~ [^/]\.php(/|$) {

        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_index index.php;
        include fcgi.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Ich habe auch meine WordPress-Site innerhalb der wp-config.php konfiguriert

define('FORCE_SSL_ADMIN',   true);
define('FORCE_SSL_LOGIN',   true);
define('FORCE_SSL_CONTENT', true);

Und die URL in der Datenbank mit der richtigen URL geändert https://www.meinewebsite.com

Mein Problem ist, ich habe das Problem ERR_TOO_MANY_REDIRECTS. Der Proxy scheint gut zu funktionieren, da ich einige Nginx-Protokolle im Container habe:

[20/Mar/2017:10:50:17 +0100] "GET /wp-login.php HTTP/1.1" 302 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

Vielen Dank an alle für die Hilfe, die Sie leisten können.

BEARBEITEN 1:

Also setze ich mein Problem fort und finde wahrscheinlich einige Antworten. Das Problem scheint bei WordPress und nicht bei der Proxy-Konfiguration zu liegen.

Wenn ich hinzufüge:

define('WP_CACHE', true); // Added by W3 Total Cache
echo 'test';exit();

In der wp-config.php ist meine Website mit meinem richtigen Zertifikat geladen und alles funktioniert gut. Mein Problem scheint also auf WordPress zu liegen, das sich auf https wiederholt, aber ich kann nicht herausfinden, warum. Ich werde versuchen, Schritt für Schritt zu debuggen.

Endlich habe ich die Lösung gefunden. Der Reverse-Proxy hat gut funktioniert. Das Problem lag in der WordPress-Konfiguration, auf die gewartet wird $_SERVER['HTTPS'] = 'on'. Aber während ich an nginx in meinem Container arbeite, leitet WordPress die Website weiterhin auf HTTPS um.

Also habe ich einfach eingestellt $_SERVER['HTTPS'] = 'on'; oben in wp-config.php und das war’s.

Hoffe das kann irgendwann helfen.

  • Lebensretter! Auch eine fastcgi_param HTTPS 'on'; in der nginx-Konfiguration für PHP-Dateien funktioniert gut

    – Flks

    26. März 2018 um 16:47 Uhr


Sie erhalten zu viele Weiterleitungen, weil Sie 443 abhören:

listen *:443 ssl;

Und Weiterleitung auf 443

proxy_set_header X-Forwarded-Proto https;

Entfernen Sie diese Zeile aus Ihrer nginx.conf:

proxy_set_header X-Forwarded-Proto https; 

  • Danke für deine Antwort. Ich habe diese Zeile in einer anderen Frage gefunden, also habe ich sie zum Testen hinzugefügt. Ich habe es gerade entfernt, habe aber immer noch das 302-Problem …

    – Mayos

    20. März 2017 um 11:32 Uhr

Hatte gerade ein ähnliches Problem beim Einrichten. Unten ist eine Beispiel-YAML-Datei, die für mich funktioniert hat.

version: '2'

services:

  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: MyPassword
      VIRTUAL_HOST: example.com # replace with real domain
      LETSENCRYPT_HOST: example.com # replace with real domain
      LETSENCRYPT_EMAIL: [email protected] # replace with real email

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: MyPassword

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    volumes:
      - /etc/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

  • Ich erhalte “502 Bad Gateway” auf https

    – Surendra Patil

    12. März 2018 um 7:36 Uhr

1364130cookie-checkWordPress im Docker-Container hinter dem Nginx-Proxy mit SSL

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy