先决条件

先决条件

我有一个安装了 PostgreSQL 的 VPS。我有一个 nginx 设置,其中包含一些指向不同工具、grafana、Node.js 站点等的反向代理。我现在正在尝试设置 PostgreSQL,但我就是无法使用基于 Web 的管理工具,该工具可以从外部访问。

我尝试使用 Apache2 托管安装普通的 pgAdmin,但这显然与 nginx 冲突。我试图找到一个关于 nginx 反向代理后面的 pgAdmin 的良好指南,但我找到的唯一一个(https://github.com/rbernardes/nginx-pgadmin) 在我尝试运行 py 配置脚本时根本不起作用。我可以更深入地研究这个问题,但我的观点是;pgAdmin 似乎与 nginx 配合得不好,我认为一定有一个有效的基于 Web 的替代方案?但这里似乎有点枯燥……

有人能解释一下吗?谢谢!

答案1

这里有更简单的方法:

首次安装研究生管理来自ftp.postgresql.org存储库:

curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add -
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list'
sudo apt update
sudo apt install pgadmin4 

有趣的部分从这里开始,打开sudo vim /etc/apache2/ports.conf并注释掉80443端口并添加新端口5050或您想要的任何端口。 Apache 端口.conf

现在让我们检查sudo vim /etc/apache2/conf-available/pgadmin4.conf一下 pgadmin 的运行位置[WSGI][2]

删除pgadmin前面的 IN ,WSGIScriptAlias代码应该是这样的。

WSGIDaemonProcess pgadmin processes=1 threads=25 python-home=/usr/pgadmin4/venv
WSGIScriptAlias / /usr/pgadmin4/web/pgAdmin4.wsgi

<Directory /usr/pgadmin4/web/>
    WSGIProcessGroup pgadmin
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Directory>

[评论]:不要添加更多流程(您将收到CSRF错误),添加更多线程如果你想要的话。

现在让我们检查我们的 VirtualHost sudo vim /etc/apache2/sites-available/000-default.conf,只需传递 SSL 证书文件和一些基本内容(记得服务端口 5050 或您选择的任何端口):

<VirtualHost *:5050>
  ServerAdmin [email protected]

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/pub.pem
  SSLCertificateKeyFile   /etc/ssl/private/perv.key
  ErrorDocument 404 "looks like you not found the page :("
  ErrorDocument 403 "It's Forbidden!"
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

[注意]:请记住sudo a2enmod ssl,如果您使用 ssl

现在完成你的研究生管理安装、设置密码并启用WSGI模块。

sudo /usr/pgadmin4/bin/setup-web.sh

检查一切是否正常并重新启动 apache 服务。

sudo apachectl -t
sudo systemctl restart apache2

让我们看看我们所爱的nginx,这是一个简单的配置,但却牢不可破:)

server {
  listen  443 ssl http2;
  server_name  your.domain.com;

  ssl_certificate     /etc/ssl/certs/pub.pem;
  ssl_certificate_key /etc/ssl/private/perv.key;

  location / {
    proxy_pass https://your.domain.com:5050;
    proxy_set_header Host $http_host;
  }

}

最后重新启动Nginx

sudo systemctl restart nginx

谢谢技术管理员用于安装研究生管理Ubuntu

答案2

尝试使用 Apache2 托管安装普通的 pgAdmin,但这显然与 nginx 冲突

如果您将 Apache2 配置为监听 nginx 未使用的不同端口,则不会发生这种情况。

pgAdmin 似乎与 nginx 配合得不太好

安装和使用 pgAdmin 配置 uWSGI应用程序,然后配置 nginx 以使用uwsgi_pass与 uWSGI 通信。


编辑 2020-05-10:更多详细信息

这里有两个解决方案,要么使用 nginx + uwsgi_pass,要么使用 Apache httpd + mod_proxy_wsgi。让我们深入研究一下这两种方法。

先决条件

  1. Python 和 Python 开发标头

    安装 Python 及其兼容的开发头文件,最好Python >=3.6. uwsgi 需要 PCRE 3 库来处理正则表达式路由。

$ sudo apt-get update && apt-get -y install build-essential python3 python3-dev libpcre3-dev libpcre3
  1. Python 虚拟环境

    在虚拟环境中安装 pgAdmin,无论是venvvirtualenvconda,甚至任何事情;只是为了确保您的操作系统包管理器不会干扰您的 python 环境(版本、包等)。

    如果你正在使用venv,它应该是这样的

$ cd /path/to/working_directory

# Install virtual environment on .env, and activate it.
$ python3 -m venv .env
$ source .env/bin/activate

# upgrade existing pip packages, and install wheel.
(.env) $ pip install --upgrade pip setuptools
(.env) $ pip install wheel

# install pgAdmin 4.21
(.env) $ pip install https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v4.21/pip/pgadmin4-4.21-py2.py3-none-any.whl

uWSGI 和 pgAdmin

uWSGI 安装

要让你的 Web 服务器连接到 pgAdmin,你需要使用 WSGI 或 HTTP 服务器。pgAdmin 支持uWSGI古尼康

在这里,我们将使用 uWSGI,但如果你使用另一个 WSGI 服务器,请确保它正在监听 UNIX 套接字/tmp/wsgi/pgadmin.sock

首先,你需要安装 uWSGI。你可以使用apt-get或者 使用安装 uWSGI pip

两者都很好;但是使用pip,你需要编写自己的服务文件;使用apt-get,你需要接受你正在使用旧版本的 uWSGI。我们将使用 Ubuntu 分布式服务文件和 pip 分布式最新版本uwsgi二进制文件安装两者

Install Ubuntu-distributed uwsgi
$ sudo apt-get -y install uwsgi

Install pip-distributed uwsgi
$ source /path/to/working_directory/.env/bin/activate
(.env) $ pip install uwsgi

# Ubuntu-distributed version
(.env) $ /usr/bin/uwsgi --version
2.0.15-debian

# pip-distributed version
(.env) $ uwsgi --version
2.0.18

# service file
(.env) $ ls /etc/init.d/uwsgi
/etc/init.d/uwsgi

pgAdmin 安装

接下来,我们将为 uWSGI 设置 pgAdmin。您需要再次进入我们的虚拟环境。我们大致如下这个 pgAdmin 官方指南

首先,创建一个本地配置。

$ cd /path/to/working_directory/.env/lib/python3.6/site-packages/pgadmin4
$ cp config.py config_local.py
$ vim config_local.py

请注意,您可以遵循 pgAdmin 的文档,但我们可以编辑DATA_DIR = '/var/lib/pgadmin'任何合理的内容,因为其他所有内容都将引用DATA_DIR。在这里,我们使用/path/to/working_directory/lib

接下来创建 pgAdmin 所需的目录

$ sudo mkdir -p /var/log/pgadmin
$ mkdir /path/to/working_directory/lib

/var/log/pgadmin并且DATA_DIR应该完全由 uWSGI 控制,因为 pgAdmin 将在 uWSGI 下运行。在这里,我们将使用www-datauWSGI 用户和组。

$ sudo chown www-data:www-data /var/log/pgadmin /path/to/working_directory/lib

请注意,我们需要允许写入/var/log/pgadminDATA_DIR让其设置。我们现在只允许用户写入,稍后我们将修复此权限。

$ sudo chmod 777 /var/log/pgadmin /path/to/working_directory/lib

进入我们的虚拟环境并运行 pgAdmin 的setup.py

$ source /path/to/working_directory/.env/bin/activate
(.env) $ cd /path/to/working_directory/.env/lib/python3.6/site-packages/pgadmin4
(.env) $ python setup.py

按照设置说明进行操作,直至完成,并记下在此处创建的电子邮件和密码。

接下来,修复/var/log/pgadminDATA_DIR权限。

$ chmod 755 /var/log/pgadmin /path/to/working_directory/lib
$ chown -R www-data:www-data /var/log/pgadmin /path/to/working_directory/lib

pgAdmin 现在应该已经完全设置好了。

集成 uWSGI 和 pgAdmin

现在,我们准备集成 pgAdmin 和 uWSGI,创建监听 UNIX 套接字的 WSGI 服务器/tmp/wsgi/pgadmin.sock

首先,使用你最喜欢的编辑器,在 中创建一个 uWSGI 配置文件/etc/uwsgi/apps-available。我们把它命名为pgadmin.ini

$ sudo vim /etc/uwsgi/apps-available/pgadmin.ini

它至少应该包含:

[uwsgi]
socket = /tmp/wsgi/pgadmin.sock
chdir = /path/to/working_directory/.env/lib/python3.6/site-packages/pgadmin4
manage-script-name = true
venv = /path/to/working_directory/.env/
master = true
processes = 1
threads = 4
mount = /=pgAdmin4:app
log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size) "%(referer)" "%(uagent)"
logger = file:/tmp/wsgi/pgadmin-access.log
uid = www-data
gid = www-data

创建所需目录,并启用我们的 pgAdmin uWSGI 应用

$ sudo mkdir -p /tmp/wsgi
$ sudo chown www-data:www-data /tmp/wsgi
$ sudo ln -s /etc/uwsgi/apps-available/pgadmin.ini /etc/uwsgi/apps-enabled/pgadmin.ini

将默认的 uWSGI 文件复制到另一个服务文件,并编辑它以使用 pip 安装的 uWSGI 二进制文件。

$ sudo cp /etc/init.d/uwsgi /etc/init.d/uwsgi-venv
$ vim /etc/init.d/uwsgi-venv
# replace DAEMON="/usr/bin/uwsgi" to DAEMON="/path/to/working_directory/.env/bin/uwsgi

uWSGI 配置应该已经完成​​。

现在,尝试启动 uWSGI。

$ sudo service uwsgi-venv start pgadmin

此处,pgadmin指的是我们之前软链接的/etc/uwsgi/apps-enabled。如果您将其链接为pgadmin.ini,则将使用pgadmin

检查 uWSGI 是否正在运行。

$ ps -eF | grep uwsgi
www-data 10582     1  2 32144 91480   0 03:56 ?        00:00:03 /path/to/working_directory/.env/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/pgadmin.ini --daemonize /var/log/uwsgi/app/pgadmin.log
www-data 10593 10582  0 87443  2640   0 03:56 ?        00:00:00 /path/to/working_directory/.env/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/pgadmin.ini --daemonize /var/log/uwsgi/app/pgadmin.log

nginx 和 uWSGI

如果你尚未安装 nginx,请使用 安装它apt-get

$ sudo apt-get -y install nginx

如果你已经安装了 nginx,则可能需要调整一些配置。如果你遇到任何问题,请告诉我。

接下来,让我们配置 nginx,以便它将任何请求传递给我们之前配置的 uWSGI。

/etc/nginx/sites-available目录中,创建一个新的 nginx 配置文件。在这里,我们将其用作pgadmin.local虚拟主机名。

$ sudo vim /etc/nginx/sites-available/pgadmin.conf

这个配置文件至少应该看起来像这样:

server {
    listen 80;
    server_name pgadmin.local;

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass unix:/tmp/wsgi/pgadmin.sock;
    }
}

如果需要它监听其他端口,请listen 80;改为listen <your_port>;

启用该配置。

$ sudo ln -s /etc/nginx/sites-available/pgadmin.conf /etc/nginx/sites-enabled/pgadmin.conf

测试并重新加载您的新 nginx 配置。

 $ sudo nginx -t && sudo service nginx reload

根据您的配置,您可能需要在此之后配置防火墙,但之后您可以使用您喜欢的浏览器浏览到您配置的虚拟主机。

 $ firefox http://pgadmin.local

httpd 和 uWSGI

这里的 httpd 和 nginx 配置没有太大区别,您只需要将 http 请求作为 WSGI 请求转发到 WSGI 服务器后端,在本例中,使用 mod_proxy_wsgi。

如果尚未安装 httpd,请先安装。

$ sudo apt-get -y install apache2 apache2-utils

如果您已经安装了 httpd,则可能需要调整一些配置。如果您遇到任何问题,请告诉我。

不要忘记安装 mod-proxy 和 mod-proxy-uwsgi,因为这两个模块都是必需的。

$ sudo apt-get -y install libapache2-mod-proxy-uwsgi

接下来,让我们配置 httpd 以将任何请求传递给我们之前配置的 uWSGI。

/etc/apache2/sites-available目录中,创建一个新的虚拟主机配置文件。在这里,我们将其用作pgadmin.local虚拟主机名。

$ sudo vim /etc/apache2/sites-available/pgadmin.conf

这个配置文件至少应该看起来像这样:

<VirtualHost *:80>
  ServerName pgadmin.local
  ProxyRequests off
  ProxyPass "/" "unix:/tmp/wsgi/pgadmin.sock|uwsgi://localhost/"
</VirtualHost>

如果您需要它来监听其他端口,则需要进行一些更改。

  1. 改成<VirtualHost *:80><VirtualHost *:<your_port>>

  2. 在 中/etc/apache2/ports.conf,删除所有不相关的Listens (包括<IfModule>s 下面的 ),并添加Listen <your_port>

  3. 如果您仍启用了默认站点,请使用 将其禁用a2dissite

启用该配置。

$ sudo ln -s /etc/apache2/sites-available/pgadmin.conf /etc/apache2/sites-enabled/pgadmin.conf

启用 mod_proxy 和 mod_proxy_uwsgi

$ sudo a2enmod proxy proxy_uwsgi

测试并重新加载您的新 httpd 配置。

$ sudo apachectl configtest && sudo service apache2 reload

根据您的配置,您可能需要在此之后配置防火墙,但之后您可以使用您喜欢的浏览器浏览到您配置的虚拟主机。

 $ firefox http://pgadmin.local

相关内容