首页 > 解决方案 > 错误:找不到版本 11 (PostgreSQL 11) 的 pg_ctl 可执行文件 + 让我们加密

问题描述

我有一个域重定向到它的 VPS 主机。我的主网站使用 WordPress CMS 有 LAMP 堆栈。另外,我在子域中使用 Odoo 作为我的后端,使用 python 和 PostgreSQL。

一切正常,直到我按照这些教程安装 Certbot Let's Encrypt 以获取 SSL 证书

对于我的 Wordpress,我安装了这个插件:

WP 加密 – 一键式单/通配符免费 SSL 证书和强制 HTTPS

这让我陷入了一个循环,因为它迫使 https 我稍后会解释它

因此,当插件不起作用时,我通过这些教程为整个 VPS 搜索了另一种方法:

如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Apache

如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Apache

完成 ubuntu 18.04 的第二个教程后,我注意到我的所有域流量都将转到 https,并且它卡在一个循环中,说的和我上面说的一样

“ERR_TOO_MANY_REDIRECTS 表示站点重定向次数过多”

并且无法访问域中 wordpress 的网站前端。

然后当我申请

“第 3 步 — 允许 HTTPS 通过防火墙”

我的互联网连接被解释了,当我回到 ssh 会话时,我发现我自己被锁定在服务器之外,并且没有找到任何重新进入的方法。

当我厌倦使用上面有 Odoo 的子域时,我遇到了同样的错误

“ERR_TOO_MANY_REDIRECTS 表示站点重定向次数过多”

直到这里我绝望了,不知道该怎么办。

我联系了我的 VPS 服务器提供商并告诉他到底发生了什么。然后是他如何设法通过终端的 URL 再次让我进入服务器,我仍然无法使用像 putty 这样的 ssh 客户端访问服务器。所以当我在他向我提供 URL 后进入服务器时,首先注意到的是他“重新启动了 VPS”将在一秒钟内完成。

所以我做的第一件事是删除 wordpress 插件“WP Encryption”并更新 mysql 数据库中 wp_options 表中的 wordpress site-url,因为插件将其从 http 更改为 https,所以我将其改回并解决了我的 wordpress 网站的 ERR_TOO_MANY_REDIRECTS .

然后我做的第二件事是禁用我在上面步骤 3 的教程中启用的 ufw 防火墙。

我立即使用 ssh 客户端腻子恢复了与服务器的连接,但我再次注意到 postgres 服务处于非活动状态,并且随着 VPS 的重新启动而中断。我试图启动该服务,但它没有给我这个错误。

Failed to start postgresql.service: Unit postgresql.service is masked.

我搜索了一个解决方案,发现这些命令可以取消屏蔽

sudo systemctl unmask postgresql
sudo systemctl enable postgresql
sudo systemctl restart postgresql

然后服务已经启动,当我运行状态命令时一切都正常

service postgresql status

回应是

● postgresql.service - LSB: PostgreSQL RDBMS server
   Loaded: loaded (/etc/init.d/postgresql; generated)
   Active: active (exited) since Thu 2020-03-26 05:54:09 UTC; 2h 22min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 2286)
   Memory: 0B
   CGroup: /system.slice/postgresql.service

但是当我尝试使用odoo通过默认端口连接到postgres时,它说:

could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"

经过多次搜索后,我发现 posgres 主集群也处于非活动状态或关闭状态,我尝试使用此命令启动它

pg_ctlcluster 11 main start

但我得到这个错误

Job for postgresql@11-main.service failed because the service did not take the steps required by its unit configuration. See "systemctl status postgresql@11-main.service" and "journalctl -xe" for details.

当我按要求运行命令时

systemctl status postgresql@11-main.service

我得到这个错误

● postgresql@11-main.service - PostgreSQL Cluster 11-main    Loaded: loaded (/lib/systemd/system/postgresql@.service; disabled; vendor preset: enabled)    Active: failed (Result: protocol) since Thu 2020-03-26 15:22:15 UTC; 14s ago   Process: 18930 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 11-main start (code=exited, status=1/FAILURE)

单独与

systemd[1]: Starting PostgreSQL Cluster 11-main...
postgresql@11-main[18930]: Error: Could not find pg_ctl executable for version 11
systemd[1]: postgresql@11-main.service: Can't open PID file /run/postgresql/11-main.pid (yet?) after start: No such file or
systemd[1]: postgresql@11-main.service: Failed with result 'protocol'.
systemd[1]: Failed to start PostgreSQL Cluster 11-main.

我猜 Let's Encrypt 向 pg_hba.conf 和 postgres.conf 添加了一个 ssl 配置,就像 id 对 apache 所做的那样,所以我搜索它们并评论了“ssl on”行并与主集群一起重新启动了 postgres 服务,但仍然没有发生任何事情同样的错误是

Error: Could not find pg_ctl executable for version 11

我知道我不应该直接在 Ubuntu/Debian 下运行 pg_ctl。我必须改用 pg_ctlcluster,它由 postgresql-common 安装。我看到了主页文档。但是当我运行“sudo pg_ctlcluster 11 main reload”命令时,我总是得到上面的错误,告诉我他找不到 pg_ctl 可执行文件

我已经为此问题进行了很多搜索,但没有任何效果如何解决版本 11 中的 pg_ctl 可执行文件?

Ps:我正在使用 Ubuntu 19.10 (GNU/Linux 5.3.0-24-generic x86_64) Odoo 11 和 postgres 11 作为数据库 odoo 无法连接到我之前提到的 postgres

编辑:不幸的是,我无法还原或恢复服务器以修复 postgres 包,因为我上次备份服务器是在 19/3 而今天是 26/3,我在此期间有重要数据

更新 27/3/2020 凌晨 4:06

我将我上次的服务器备份与生产服务器进行了比较,发现很多 postgres 文件丢失了!!像 int 这个路径 /usr/lib/postgres/11/ 和 /etc/postgres/11/ 我认为 postgres 在重新启动服务器时有些损坏并丢失了一些文件 >>> 但发现数据库的数据文件位于在 /var/lib/postgres/11/ <<< 我可以在我的备份服务器中读取它们吗?我会尽力让你知道

标签: wordpresspostgresqlubuntusslodoo

解决方案


所以终于经过一个小时的挖掘

所有损坏和丢失的 PostgreSQL 文件,我失去了修复它们的希望,我不知道是什么原因造成的,但它与服务器意外重启有关。

因此,我设法在此路径中找到了用于生产服务器的重要数据库信息的主集群数据文件

/var/lib/postgres/11/

我通过使用此命令压缩整个文件夹从中获取了备份

zip -r main.zip main/

然后我从这里使用这些命令对 postgres 进行了完全清除和重新安装

apt-get --purge remove postgresql\*

从您的系统中删除所有 PostgreSQL。仅仅清除 postgres 包是不够的,因为它只是一个空的元包。

删除所有 PostgreSQL 软件包后,运行:

rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

然后我用这个命令安装了 postgres 来匹配 odoo11

sudo apt-get install postgresql libpq-dev -y

然后创建 ODOO PostgreSQL 用户

sudo su - postgres -c "createuser -s odoo" 2> /dev/null || true

现在一切正常,odoo 应该可以正常工作,但您仍然没有任何数据库

因此,要从我们之前获取的集群文件夹中恢复备份,我们需要将 zip 文件移动到我们从中获取的同一目录中

/var/lib/postgres/11/

但在此之前你应该停止 postgres 服务

sudo systemctl stop postgresql

并确保它已经停止

sudo systemctl status postgresql

之后重命名postgres现在使用的主集群,因为它是空的,我们不需要它,因为我们正在用我们的备份集群替换它

mv /var/lib/postgres/11/main /var/lib/postgres/11/main_old

然后使用此命令将 zip 文件从您备份的位置移动到 postgres 集群文件夹

mv /backups/main.zip /var/lib/postgres/11/

使用此命令将文件夹解压缩到同一路径中

unzip -a /var/lib/postgres/11/main.zip

解压缩文件夹后,将所有权授予您的 postgres 用户和组

chown -R postgres:postgres main

那你就可以走了。启动 Postgres 服务

sudo systemctl start postgresql
sudo systemctl status postgresql

并确保您还启动了主集群服务

pg_ctlcluster 11 main start

如果您停止了 odoo,请确保也启动它

service odoo-server start

Ps:我通过在我的 odoo.config Apache2 虚拟主机中注释 ssl 配置解决了 odoo 子域的 ERR_TOO_MANY_REDIRECTS 问题,该主机之前允许加密更新,并且在安装之前一切都回到了它的位置让我们加密。

我想我会把它留在这里并且在我弄清楚如何在测试服务器中使用它之前不会再在生产中使用 ssl .. 感谢您的时间我希望我的问题和回答对未来的人有所帮助


推荐阅读