我已经安装了一个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?
致谢
卡斯滕