在 CentOS 7 上安装 pgAdmin 4

PostgreSQL 有一个官方的图形界面管理工具:pgAdmin。目前,已经到了 pgAdmin4 了,它是一个使用 Python 及 Flask 框架开发的工具。有两种运行模式:桌面模式及 Web 模式。

通常,CentOS 是作为 PostgreSQL 数据库的服务器运行,所以我们在 CentOS 上以 Web 模式运行 pgAdmin,如此,就不用再:

  • 在服务器上,通过 psql 命令行来管理 PostgreSQL
  • PostgreSQL 可以保持只监听本地,而不需要暴露到公网上,保证数据库安全

目标

本文的目标是实现 pgAdmin4 的安装,并以 uwsgi 运行,只监听本地请求。最终,使用 nginx 将其暴露到公网上。由于 pgAdmin 是使用 Flask 开发,所以通过 uwsgi 运行变得非常容易。

环境

pgAdmin 可以运行在 Python 2.7 和 Python 3 环境中,强烈建议使用 Python 3。本例使用 lnpp 一键安装包 来安装 Python 3.6、 nginx 和 PostgreSQL 10。

  • Python:Python 3.6
  • PostgreSQL:PostgreSQL 10
  • nginx:nginx 1.12
  • pgAdmin4 项目目录:/opt/pgadmin
  • 虚拟环境:/opt/pgadmin/venv
  • 用户及组:nginx:nginx
  • pgAdmin 数据目录:/var/lib/pgadmin
  • pgAdmin 日志:/var/log/pgadmin
  • nginx:
    • 主配置文件:/etc/nginx/nginx.conf
    • 虚拟主机配置文件:/etc/nginx/server/pgadmin.conf
  • pgAdmin 默认管理员

安装

下载 pgAdmin4

在 pgAdmin 官网的 Python Wheel 页面下载最新版的 pgAdmin4,本例下载的是 v3.0 版,保存在主目录下 ~

cd ~
wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v3.0/pip/pgadmin4-3.0-py2.py3-none-any.whl

创建目录

需要创建3个目录:

  • /opt/pgadmin pgAdmin4 的项目目录
  • /var/lib/pgadmin pgAdmin4 的数据目录
  • /var/log/pgadmin pgAdmin4 的日志

创建 pgAdmin4 的项目目录

mkdir -p /opt/pgadmin

创建 pgAdmin4 的数据目录

mkdir -p /var/lib/pgadmin

创建 pgAdmin4 的日志目录

mkdir -p /var/log/pgadmin

创建虚拟环境

我们将 pgAdmin4 虚拟环境创建在它的项目目录 /opt/pgadminvenv 子目录下:

cd /opt/pgadmin
python3.6m -m venv venv

激活虚拟环境

为了安装 pgAdmin4 ,需要先激活虚拟环境

source venv/bin/activate

更新 pip 和 setuptools(可选)

为了保证安装成功,可以更新虚拟环境里的 pip 和 setuptools

pip install --upgrade pip
pip install --upgrade setuptools

安装 pgAdmin4

现在可以安装 pgAdmin4 了

pip install ~/pgadmin4-3.0-py2.py3-none-any.whl

如果网速太慢,可以使用清华大学的 pip 镜像:

pip install ~/pgadmin4-3.0-py2.py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple

至此,pgAdmin4 安装完成。

设置密码

运行以下命令,对pgadmin4的用户名和密码进行设置:

python /opt/pgadmin/venv/lib/python3.6/site-packages/pgadmin4/setup.py

不报错的话,说明 pgAdmin4 安装成功。pgAdmin4 会要求你输入 pgAdmin4 的管理员Email 和密码,在此分别输入 [email protected]wrdll.com

uwsgi 运行 pgAdmin4

再次提醒,pgAdmin4 是使用 Flask 开发的!永远不要在生产环境运行 Flask 的开发服务器。现在,我们应该使用 uwsgi 来在生产环境运行 pgAdmin4。

安装 uwsgi

pip install uwsgi

创建 uwsgi 配置文件

vi /opt/pgadmin/uwsgi.ini

输入以下内容:

[uwsgi]
chdir=/opt/pgadmin/venv/lib/python3.6/site-packages/pgadmin4
home=/opt/pgadmin/venv
wsgi-file=pgAdmin4.wsgi
master=true
processes=2
socket=/opt/pgadmin/pgadmin.sock
chmod-socket=666
logfile-chmod=644
daemonize=/opt/pgadmin/pgadmin.log
uid=nginx
gid=nginx
procname-prefix-spaced=pgadmin

更改权限

为了安全,我们需要使用 nginx:nginx 这个用户和用户组来运行 pgAdmin4,所以需要将相应的目录权限进行修改:

chown -R nginx:nginx /opt/pgadmin
chown -R nginx:nginx /var/lib/pgadmin
chown -R nginx:nginx /var/log/pgadmin

启动 uwsgi

现在可以启动 uwsgi 了

uwsgi -c uwsgi.ini

配置 nginx 的反向代理

nginx 的主配置文件

vi /etc/nginx/nginx.conf

在该文件的 http 中加入:

include /etc/nginx/server/*.conf;

创建虚拟主机配置文件目录

mkdir -p /etc/nginx/server

创建 pgadmin 虚拟主机配置文件

vi /etc/nginx/server/pgadmin.conf

输入以下内容:

server {
    listen 80;
    server_name pgadmin.wrdll.com; # 改成你自己的域名

    location / {
                try_files $uri @pgadmin;
        }
        location @pgadmin {
                include /etc/nginx/uwsgi_params;
                uwsgi_pass unix:/opt/pgadmin/pgadmin.sock;
        }
}

测试并重启 nginx

nginx -t
nginx -s reload

安装好之后,第一次登录时注意:1、点击“login”按钮进行登录,不要直接按回车;2、可能一直出现登录页面,此时重复登录几次即可;3、以后登录基本能正常工作了。此问题的原因暂时不知,但在 debian 下是没有这个问题的。