将 VPS 上 drupal 网站迁移到 docker,导入数据库后网站打不开.求大家指导

2020-01-19 17:13:20 +08:00
 programV2
以下是我的操作步骤: (请 V 友们帮我看看怎么排查问题, 弄了两天了还是搞不定, 谢谢

1.在 VPS 上的运行 Docker 环境,配置(php7.2+mysql5.7+ngninx1.12)环境, docker compose 好后上传一个全新的 drupal8 安装包安装测试,安装过程中没有出现异常提示, 说明环境搭建正常。
2. 安装时设置网站和数据库信息,将本地所有文件和目录按原结构上传到 docker 相应容器挂载目录,mysql 将备份数据库文件导入;
3. 修改 /sites/default/settings.php 文件中的数据库用户名、数据库表、数据库密码。

谢谢大家, 祝大家春节快乐!
2287 次点击
所在节点    程序员
52 条回复
sleepm
2020-01-21 14:19:04 +08:00
备份数据库文件是.sql 还是 mysql/data 目录
是 sql 的话,你打开看有没有 system 表,没有的话,重装 drupal 吧,然后原来的文章啥的,直接把数据表替换掉
programV2
2020-01-21 15:16:08 +08:00
@sleepm 谢谢大佬, 我备份的数据库文件是 .sql , 打开看没有 system 表, 请问我重装 drupal 后该怎么操作? 把数据表替换成什么?
sleepm
2020-01-21 15:26:29 +08:00
安装一个新的 drupal,然后备份数据库,把备份出来的 sql 和前面备份的做 diff,
然后找出你的文章之类的,把那些 sql 语句复制出来,弄一个新的.sql ,再做导入
programV2
2020-01-21 15:39:32 +08:00
@sleepm 我的备份数据库应该是成功导入了, 因为我尝试用网站上的站内搜索功能, 一切正常的, 所以现在问题是我该在哪个数据表关闭模块? 谢谢. 祝好.
sleepm
2020-01-21 15:57:28 +08:00
http://alejandro.bio/node/113
programV2
2020-01-21 16:31:27 +08:00
@sleepm 谢谢🙏 这博客之前我看过, 可是不知道为什么我的备份数据库没有 system 表?第一步就卡住了,请问除了把备份出来的 sql 和前面备份的做 diff,
把 sql 语句复制出来弄一个新的.sql 外还有别的办法吗?
sleepm
2020-01-21 17:32:37 +08:00
其他方法也是搞数据库,把缺失的表补回去
programV2
2020-01-21 20:38:25 +08:00
@sleepm 谢谢! 我用 cat drupal/backup.sql | docker exec -i drupal8_mysql /usr/bin/mysql -u root --password=password drupal 导入数据库和下面这种方式有什么区别吗?
docker exec -i drupal8_mysql /usr/bin/mysql -u root --password=password drupal < drupal/backup.sql
sleepm
2020-01-21 21:55:55 +08:00
如果结果都一样,应该没啥区别。。
| 是管道符
< 是重定向符号
merryfreespace
2020-01-22 07:05:09 +08:00
Drupal 8 没有 system table.

删除掉 recaptcha module
truncate table cache_config 用来清空缓存表的

如果你熟悉 drupal console:
Disable module
./vendor/bin/drupal mou module_name

Enable module
./vendor/bin/drupal moi module_name

Drush 命令上面有人介绍了。
programV2
2020-01-23 01:26:07 +08:00
@merryfreespace 非常感谢 V 友的帮助!! 我试着把 recaptcha 和 captcha 两个文件夹都删除掉了, 然后进入数据库执行了下列命令清除缓存, 并重启所有容器, 但是 captcha 错误提示还是出现(见附图)
TRUNCATE cache_config;
TRUNCATE cache_container;
TRUNCATE cache_data;
TRUNCATE cache_default;
TRUNCATE cache_discovery;
TRUNCATE cache_dynamic_page_cache;
TRUNCATE cache_entity;
TRUNCATE cache_menu;
TRUNCATE cache_render;
TRUNCATE cache_toolbar;

附图:![PNG]( https://i.loli.net/2020/01/23/OFRub36ecsyAJfD.png)

已多次重启本地电脑和浏览器使用隐私模式
programV2
2020-02-07 16:35:44 +08:00
@merryfreespace 两位 V 友好, 经过假期折腾 删掉 recaptcha 和 captcha 两文件夹并进入数据库清缓存,现在没有出现验证码终于进入管理后台, 但是点击后台任意菜单都出错, 请问这可能是什么原因呢?

@sleepm

error log:


2020/02/07 07:58:56 [error] 6#6: *108 FastCGI sent in stderr: "PHP message: Uncaught PHP Exception Drupal\Component\Plugin\Exception\PluginException: "Plugin (captcha) instance class "Drupal\captcha\Element\Captcha" does not exist." at /var/www/html/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php line 97" while reading response header from upstream, client: 1.2.3.4, server: example.com, request: "GET /user/1/edit HTTP/1.1", upstream: "fastcgi://172.19.0.3:9000", host: "example.com", referrer: "http://example.com/user/1"

2020/02/07 07:59:19 [error] 6#6: *170 FastCGI sent in stderr: "PHP message: Uncaught PHP Exception Drupal\Component\Plugin\Exception\PluginException: "Plugin (captcha) instance class "Drupal\captcha\Element\Captcha" does not exist." at /var/www/html/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php line 97" while reading response header from upstream, client: 1.2.3.4, server: example.com, request: "GET /admin HTTP/1.1", upstream: "fastcgi://172.19.0.3:9000", host: "example.com", referrer: "http://example.com/user/1"

access log:

1.2.3.4 - - [07/Feb/2020:07:58:56 +0000] "GET /user/1/edit HTTP/1.1" 500 537 "http://example.com/user/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
1.2.3.4 - - [07/Feb/2020:07:58:56 +0000] "GET /modules/admin_toolbar/admin_toolbar_tools/misc/icons/ffffff/d8-item.svg HTTP/1.1" 200 1499 "http://example.com/modules/admin_toolbar/admin_toolbar_tools/css/tools.css?pc5ppi" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
1.2.3.4 - - [07/Feb/2020:07:59:00 +0000] "GET /modules/coffee/images/icons/bebebe/coffee.svg HTTP/1.1" 200 1947 "http://example.com/modules/coffee/css/coffee.css?pc5ppi" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
1.2.3.4 - - [07/Feb/2020:07:59:19 +0000] "GET /admin HTTP/1.1" 500 537 "http://example.com/user/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
1.2.3.4 - - [07/Feb/2020:07:59:23 +0000] "GET /core/misc/icons/ffffff/hamburger.svg HTTP/1.1" 200 510 "http://example.com/core/modules/toolbar/css/toolbar.icons.theme.css?pc5ppi" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
programV2
2020-02-07 21:18:37 +08:00
@gefranks 两位大佬好, 我把日志报错信息贴在 #32 楼了, 能否帮忙看看? 卡在最后这一步, 谢谢!
@manami
gefranks
2020-02-08 03:38:18 +08:00
以我浅薄的知识看还是 captcha 那边出错了,没清干净吧
merryfreespace
2020-02-11 05:05:33 +08:00
通過 drupal 後臺清空 cache 試試。再看看 compose.json 和 lock 是否有相關插件。
programV2
2020-02-13 21:02:58 +08:00
@merryfreespace @gefranks
@sleepm
@sleepm 非常感谢几位热心 V 友🙏🙏

我 docker-compose.yml 部分设置如下
version: "3"
services:
nginx:
image: nginx:$NGINX_TAG
container_name: "${PROJECT_NAME}_nginx"
ports:
- $NGINX_PORTA
volumes:
- "./drupal/web:/var/www/html"
- "./drupal/logs/nginx:/var/log/nginx"
- "./drupal/nginx/nginx.conf:/etc/nginx/conf.d/default.conf"
- "./drupal/ssl:/etc/ssl"
depends_on:
- php

drupal:
image: drupal:$DRUPAL_TAG
container_name: "${PROJECT_NAME}_drupal"
volumes:
- "./drupal/web:/var/www/html"
- "./drupal/mysql:/var/lib/mysql"
restart: always
depends_on:
- mysql


之前安装网站时赶时间运行了 chmod -R 777, 现在想把主机上挂载的网站源码文件夹./drupal/web 的 owner 改为 www-data 用户, 我进 nginx 容器发现没有 www-data 这个用户名,请问 nginx 服务访问 /drupal/web 用的是哪个用户名?



P.S. 我 主机建了 3 个 docker 容器:Nginx,Drupal, MySQL, 其中 Nginx 和 Drupal 容器都是挂载到 ./drupal/web , 这样我是不是需要同时改这两个容器的 uid gid? 我现在在主机新建普通用户 foo: useradd -m -s -u 2005 -g 2005 foo , 还要分别进这两个容器执行下列命令吗? 但 nginx 容器发现没有 www-data 这个用户名

usermod -u 2005 www-data
groupmod -g 2005 www-data
find / -user 82 -exec chown -h www-data {} \;
find / -group 82 -exec chgrp -h www-data {} \;
sleepm
2020-02-13 22:45:25 +08:00
depends_on:
- php
改 php 的
nginx 做最靠近用户浏览器的
用户访问一个网页,会请求到静态的,比如图片,css,js
动态的,比如.php
静态的不需要处理,nginx 直接返回给用户
动态的,nginx 会交给后端 fastcgi_pass (在 nginx 配置中),然后 php 返回给 nginx,再给用户
那就是 php 容器了
programV2
2020-02-14 00:02:25 +08:00
@sleepm 谢谢🙏, 我上面手抖写錯了,drupal 容器=php 容器(镜像是 drupal + php); 好的,我只要改 php 容器内的 www-data 用户 uid
programV2
2020-02-14 15:27:01 +08:00
@sleepm V 友您好有两个疑惑想向您请教:
我 docker-compose.yml 设置 nginx 容器
ports:
- 80:80
-443:443

发现主机上监听的只有 IPV6 的端口,
root@abc:~# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:42303 0.0.0.0:* LISTEN 2835/containerd

tcp6 0 0 :::443 :::* LISTEN 2483/docker-proxy

tcp6 0 0 :::80 :::* LISTEN 2471/docker-proxy

疑惑:
1. 我进 nginx 容器内执行 netstat -tnlp, 发现 ipv4 的 80 和 443 都在监听,
但是我在 nginx.conf 配置文件中只设置 listen 443;为什么还会监听 80 的端口呢?? 是因为上面的 docker-compose.yml 中已经开启所以没法在 nginx.conf 配置中关闭 80 端口吗?

2.我用 v4 地址还可以访问主机网站, 据V友讲是内核默认会把 v4 过来的地址转换成特殊的 v6 地址, 但是我 nginx 容器内只监听 v4 的地址,那是不是说系统还得把这个特殊的 v6 地址再次转换成 v4 地址才能与容器内的 nginx 服务通信?
sleepm
2020-02-14 17:02:07 +08:00
第一个问题
docker-compose.yml 里面的设置是映射端口,map,不管容器内有没监听,只管映射
第二个问题
如果只监听 v4 的,那客户访问 v6 的地址,会得到 connection refused 响应

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639219

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX