我有一个安装了 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
并注释掉80和443端口并添加新端口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。让我们深入研究一下这两种方法。
先决条件
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
Python 虚拟环境
在虚拟环境中安装 pgAdmin,无论是
venv
,virtualenv
,conda
,甚至任何事情;只是为了确保您的操作系统包管理器不会干扰您的 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-data
uWSGI 用户和组。
$ sudo chown www-data:www-data /var/log/pgadmin /path/to/working_directory/lib
请注意,我们需要允许写入/var/log/pgadmin
并DATA_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/pgadmin
和DATA_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>
如果您需要它来监听其他端口,则需要进行一些更改。
改成
<VirtualHost *:80>
<VirtualHost *:<your_port>>
在 中
/etc/apache2/ports.conf
,删除所有不相关的Listen
s (包括<IfModule>
s 下面的 ),并添加Listen <your_port>
。如果您仍启用了默认站点,请使用 将其禁用
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