前情提要
由于自己的本地主机的情况发生了重大变化,本地的两主机小机器的使命算是完成了。所以,最后没办法不得不上云了。网站整体的内容和域名不作改变。
还好还好,基于 Docker 的部署,所以整体的迁移是相当相当的方便的。本来想着折腾好久要,最后发现,前前后后没到20分钟,就差不多搞定了,也顺便解决了之前部署中的一些BUG。这一篇,主要就是记录迁移过程中的各种操作,后面可以很方便的进行复用。
过程记录
这里之间参考前面的文章,Docker集群搭建,直接部署portainer,有了可视化的管理前端。
mkdir -p /opt/portainer
docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=//opt/portainer,dst=/data \
portainer/portainer \
-H unix:///var/run/docker.sock
服务器上nginx配置好反向代理。
location ^~ /portainer/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
access_log off;
proxy_pass http://portainer/;
rewrite ^/portainer/(.*)$ /$1 break;
}
这里使用 traefik 实现内部的反向代理的功能,理由和之前一样,为了整体更加的和谐,和和系统的更加的兼容。这里就直接使用了。下面直接给出了compose:
version: '3'
services:
reverse-proxy:
image: traefik
command: --api --docker --docker.swarmMode --docker.watch --web
ports:
- "8080:80"
- "8081:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- traefik_default
deploy:
placement:
constraints:
- node.role == manager
networks:
traefik_default:
使用上面的配置,直接进行部署即可,一般没有什么大的问题。关键期方便的地方,可以进行热配置,直接通过对于服务的label的配置指定转发的规则。
后面直接,再上我们的 docker-compose,进行wp-blog 的部署:
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_DATABASE_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wp_network
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
restart: always
ports:
- 80
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_CONFIG_EXTRA: |
/* Multisite */
define('WP_REDIS_HOST', 'redis');
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_DATABASE', '0');
networks:
- tfk_traefik_default
- wp_network
deploy:
labels:
traefik.frontend.rule: "Host:ray.i124u.cf"
traefik.port: "80"
traefik.docker.network: tfk_traefik_default
traefik.frontend.passHostHeader: "true"
traefik.frontend.whiteList.useXForwardedFor: "true"
redis:
image: redis
restart: always
networks:
- wp_network
networks:
wp_network:
tfk_traefik_default:
external: true
volumes:
db_data:
wp_data:
然后直接部署,问题就应该差不多了。
HTTPS Mix-content 的解决
另外,这里胡乱的解决了一个前面很烦人的问题,就是使用这种方式的部署,wp的部分的静态资源是直接去请求 http 的站点的,最后会因为是 mix-content 最后被服务器的安全策略直接屏蔽了,导致各种的样式错误。
上了云了,就不需要进行本地访问了,所以前面的通过在wp-config
里面对 home和root 进行动态修改的操作就不需要了。直接硬编码即可。
在配置文件里面有注意到这样的一个部分:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
这里面是有一个 https 的宏的,需要一个 HTTP_X_FORWARDED_PROTO
的头才能将它置位,所以我们就直接在nginx 里面对其进行设置。
location / {
proxy_set_header Host $host;
proxy_ignore_headers Set-Cookie Cache-Control; #这句代码很关键,尤其要忽略set-cookie
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 https; # 《--这里
client_max_body_size 100m;
proxy_pass http://127.0.0.1:xxxx;
}
后面就是全站的 https 了,就不会再向http来拉取内容。
配置站点多域名
由于路由和转发是在 traefik 上实现的,所以之于Nginx还是显得比较陌生,所以这里就试着来使用两个域名作为本站点的访问,在issue里面找到了和自己情况类似的内容,所以参考之
在我们的容器的label 里面直接配置:
traefik.port: '80'
traefik.frontend.rule: 'Host:ray.i124u.cf,blog.diglp.xyz'
就可以实现多个域名对应同一个容器了,使用 ,
表示是规则的 或关系,使用 ;
表示是与关系。另外别忘了设置 proxy_set_header Host $host;
否则是无法正确路由的