问:如何在NGINX SSL反向代理后面的官方Wordpress容器中配置Apache

时间:2018-07-12 13:31:32

标签: wordpress docker nginx reverse-proxy bad-request

我已经安装了一个Wordpress容器(wordpress官方最新映像,包含Apache和MySQL),该容器在其本地环境(192.168.xxx.xxx)中运行良好。无需任何额外配置,即可使用。没有SSL,使用纯HTTP。

我还安装了SSL NGINX反向代理(letsencrypt),它可以与其他SSL / HTTPS东西(NGINX中的网站,NextCloud,2个Ghost博客等)配合使用。

我当时认为通过反向代理连接WP是小菜一碟,但是我错了。我已经用了将近两天了,它确实发挥了我的作用。我在Internet和此站点上发现了很多东西,但是这些都没有真正的帮助。

我收到“错误的请求”回复,我不知道该如何超越这一点。

以下内容似乎有点多,但我尝试尽可能简洁。

我的目标:

让WP在SSL反向代理后面以HTTP模式工作。

我的设置:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somepassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: somepassword

   wordpress:
     links:
       - db
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "32768:80"
     restart: always
     environment:
       VIRTUAL_HOST: sub.domain.tld
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: somepassword
volumes:
    db_data:

如前所述,以上内容与docker-compose一起安装,并且可以立即与http://192.168.xxx.xxx:32768一起使用。

我的NGINX反向代理在另一台服务器上。这也是一个docker容器,安装了以下docker-compose.yaml:

version: '3'  
services:
  app:
    restart: always
    privileged: true
    image: linuxserver/letsencrypt
    container_name: letsencrypt
    ports:
      - "8088:80"
      - "443:443"
    volumes:
      - ./letsencrypt:/config
    environment:
      - URL=domain.tld
      - SUBDOMAINS=sub1,sub2,sub3
      - VALIDATION=http
      - DHLEVEL=2048
      - EMAIL=my@email.addr
      - ONLY_SUBDOMAINS=true
      - EXTRA_DOMAINS=sub.otherdomain.tld

这可以与其他许多服务一起使用,所以我认为这是可以的。

然后我为wp子域创建了一个站点配置:

upstream wp {
    server 192.168.xxx.xxx:32768;
    keepalive 64;
 }

server {  
    listen 443 ssl;
    server_name sub.otherdomain.tld;

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

    ###SSL Certificates
    ssl_certificate /config/keys/letsencrypt/fullchain.pem;
    ssl_certificate_key /config/keys/letsencrypt/privkey.pem;

    ###DiffieñHellman key exchange ###
    ssl_dhparam /config/nginx/dhparams.pem;

    ###SSL Ciphers
    ssl_ciphers .....;

    ###Extra Settings###
    ssl_prefer_server_ciphers on;

    ### Add HTTP Strict Transport Security ###
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";


      location / {
        include /config/nginx/proxy.conf;

        proxy_pass http://wp;

#        pass to HTTP test server
#        proxy_pass http://192.168.xxx.xxx:80;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-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-Nginx-Proxy true;
        proxy_set_header HTTPS "on";
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}

以上所有都是我已经配置的。另外,我已经相应地设置了WP URLs。我还没有做的是对WP容器内的任何修改。我希望WP本身可以处理任何Apache设置,因此不需要进一步的配置。

因此,以上结果为Bad Request

由于无法正常工作,我将proxy_pass从WP服务更改为空闲的HTTP测试服务器(只是另一个服务器上的另一个nginx容器)。

#        proxy_pass http://wp;

#        pass to HTTP test server
        proxy_pass http://192.168.xxx.xxx:80;

我写了一个小的PHP脚本,向我显示了传入请求的标头:

Cache-Control: max-age=0
Accept-Language: de-de
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/9.1.3 Safari/601.7.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Https: on
X-Nginx-Proxy: true
X-Forwarded-Host: sub.otherdomain.tld
X-Forwarded-Server: sub.otherdomain.tld
X-Forwarded-Proto: https
X-Forwarded-For: 80.147.xxx.xxx
X-Real-Ip: 80.147.xxx.xxx
Host: sub.otherdomain.tld

请注意,我已经使用FireFox和Chrome尝试过此操作,因此不仅限于此测试使用的旧版Safari。通过相同的结果。

我的初步结论:反向代理设置和SSL证书是完整的。我可以从互联网上通过SSL反向代理访问HTTP服务器,而不会出现任何错误。

我现在的假设是,反向代理是好的。另外,WP也不错。至少在本地通过内部IP地址。我可能会缺少的一点是Apache,它位于我的代理和WP之间。

还要注意,我发现了很多有关修改.htaccess的东西,但是据我了解,这些位已经在最新的WP映像中实现了。

root@57f2961f7428:/var/www/html# cat .htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

问题是:我需要在WP容器中的Apache中进行配置吗? 000-default.conf?

如何通过SSL反向代理访问WP?

致谢

卡斯滕

0 个答案:

没有答案