如何在 Ubuntu 22.04 上安装 PostgreSQL 和 pgAdmin
PostgreSQL 或 Postgres 是一种实现 SQL 查询语言的开源对象关系数据库管理。它具有可靠事务和无读锁并发等高级功能,使我们能够构建容错环境和复杂的应用程序。
pgAdmin 是 PostgreSQL 的开源管理工具。它支持多个平台,包括 Windows、macOS 和 Linux。
本教程将教您如何在 Ubuntu 22.04 服务器上安装 PostgreSQL 14 和 pgAdmin 4。
先决条件
运行 Ubuntu 20.04 的服务器。
非 root sudo 用户。
完全限定域名 (FQDN),例如 pgadmin.example.com
。
确保一切都已更新。
$ sudo apt update
$ sudo apt upgrade
您的系统需要一些软件包。
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
其中一些软件包可能已经安装在您的系统上。
第 1 步 - 安装 PostgreSQL
Ubuntu 22.04 默认附带 PostgreSQL 14。要安装,请发出以下命令。
$ sudo apt install postgresql postgresql-contrib
postgresql-contrib 包包含一些额外的实用程序。
您还可以使用 PostgreSQL 的官方 APT 存储库进行安装。运行以下命令添加 PostgreSQL GPG 密钥。
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
将 APT 存储库添加到您的源列表中。
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
更新系统存储库。
$ sudo apt update
现在,您可以使用上述命令安装 PostgreSQL。
检查 PostgreSQL 服务的状态。
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-05-16 11:20:35 UTC; 5 days ago
Process: 30544 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 30544 (code=exited, status=0/SUCCESS)
CPU: 2ms
May 16 11:20:35 postgresql systemd[1]: Starting PostgreSQL RDBMS...
May 16 11:20:35 postgresql systemd[1]: Finished PostgreSQL RDBMS.
您可以看到该服务默认已启用并正在运行。
第 2 步 - 使用 PostgreSQL 角色和身份验证方法
Postgres 使用称为角色的概念来处理身份验证和数据库访问。角色代表一个用户或一组用户。 Postgres 不区分用户和组。
Postgres支持多种身份验证方法,例如以下
- 信任 - 只要满足配置文件中定义的条件,就允许无需任何密码的连接。
- 密码 - 这是不言自明的,需要密码才能访问。
- Ident - 此方法仅在 TCP/IP 连接上受支持,并且对于远程连接很有用。
- Peer - 与 Ident 相同,但仅用于本地连接。
默认情况下,Postgres的安装使用对等身份验证方法。在此方法下,它将 Postgres 角色与匹配的 Linux 系统帐户关联起来。如果角色存在,则您可以使用具有相同用户名的 Linux 帐户登录。
PostgreSQL 安装会创建一个与默认角色关联的用户帐户 postgres
。您可以使用以下命令切换到系统上的 postgres
帐户。
$ sudo -i -u postgres
使用 psql
命令访问 PostgreSQL shell。
postgres@howtoforge:~$ psql
您将登录到 PostgreSQL shell。
psql (14.3 (Ubuntu 14.3-1.pgdg22.04+1))
Type "help" for help.
postgres=#
输入 exit
或 \q
关闭 shell。
您还可以通过单个命令访问 PostgreSQL shell。以下命令在 postgres
帐户下运行 shell。退出 shell 会将您带到当前的系统用户。
$ sudo -u postgres psql
第 3 步 - 创建新角色
您可以使用createuser
命令创建新角色,也可以从psql
shell创建它们。要使用 createuser
命令,您需要登录 postgres
帐户。如果登录到 postgres,请运行以下命令来创建新角色。
postgres@howtoforge:~$ createuser --interactive
--interactive
标志将提示您输入角色的名称,并询问它是否应该具有超级用户权限。
您还可以直接从您的帐户运行该命令。
$ sudo -u postgres createuser --interactive
您将得到以下输出。
Enter name of role to add: navjot
Shall the new role be a superuser? (y/n) y
要从 psql
shell 创建角色,请在进入 shell 后使用以下命令。
postgres-# CREATE ROLE username WITH SUPERUSER CREATEDB CREATEROLE LOGIN ENCRYPTED PASSWORD 'yourpassword';
在这里,我们创建具有超级用户、创建数据库、创建角色和登录等权限的角色。
您可以使用\du
命令查看所有用户的列表。
postgres-# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
username | Superuser, Create role, Create DB | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
第 4 步 - 创建数据库
要创建数据库,我们将使用createdb
命令。如果登录到 postgres
帐户,请运行以下命令来创建新数据库。
postgres@howtoforge:~$ createdb howtoforge
您还可以从您的帐户运行该命令。
$ sudo -u postgres createdb howtoforge
您还可以使用 psql
shell 创建数据库。为此,请从 shell 运行以下命令。
postgres-# CREATE DATABASE howtoforge;
我们可以通过运行以下命令向刚刚在数据库上创建的用户授予权限。
postgres-# GRANT ALL PRIVILEGES ON DATABASE howtoforge TO username;
您可以使用\l
命令检查所有数据库的列表。
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
howtoforge| postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | username=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
第 5 步 - 启用远程访问
默认情况下,PostgreSQL 服务器仅侦听 localhost 接口。要启用远程访问,请打开文件 /etc/postgresql/14/main/postgresql.conf
并更改行 #listen_addresses='localhost'
,取消注释并修改为如下所示的连接和身份验证部分。
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
重新启动 PostgreSQL 服务。
$ sudo systemctl restart postgresql
要验证更改,请运行以下命令。
$ ss -nlt | grep 5432
您将得到以下输出,显示 PostgreSQL 正在侦听所有接口。
LISTEN 0 244 0.0.0.0:5432 0.0.0.0:*
LISTEN 0 244 [::]:5432 [::]:*
下一步是将服务器配置为接受远程连接。这是通过编辑文件 /etc/postgresql/14/main/pg_hba.conf
来完成的。打开文件进行编辑。
$ sudo nano /etc/postgresql14/main/pg_hba.conf
您可以在此处配置对单个或所有数据库的访问,并定义哪些用户可以通过哪些接口访问它们。为了使密码身份验证起作用,请选择 scram-sha-256
作为身份验证方法。以下是一些您可以使用的示例。
# TYPE DATABASE USER ADDRESS METHOD
# The username can access all databases from all locations using scram-sha256 password
host all username 0.0.0.0/0 scram-sha256
# The username can access only the howtoforge from all locations using scram-sha256 password
host howtoforge username 0.0.0.0/0 scram-sha256
# The username can access all databases from a trusted location (192.168.1.134) without a password
host all username 192.168.1.134 trust
完成后,按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
在远程访问生效之前还剩下最后一步。您需要打开防火墙端口 5432。运行以下命令打开该端口。
$ sudo ufw allow 5432/tcp
这将允许任何 IP 地址访问 PostgreSQL。但是,您应该将其限制在受信任的 IP 范围内。为此,请运行以下命令。以下命令允许从 192.168.1.0/24
子网访问 PostgreSQL。
$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5432
第 6 步 - 安装 pgAdmin 4
pgAdmin 可以作为 Ubuntu 软件包安装,也可以使用 Python 安装。将其安装为 ubuntu 软件包会默认安装 Apache 服务器。但是,我们将在教程中使用 Nginx。因此,我们将使用 Python 轮来安装它。
为 pgAdmin 创建数据和日志目录。
$ sudo mkdir /var/lib/pgadmin
$ sudo mkdir /var/log/pgadmin
为 pgAdmin 创建一个应用程序文件夹。
$ sudo mkdir /opt/pgadmin
切换到root用户。
$ sudo su -
首先,安装Python所需的几个重要包。
$ apt install build-essential python3-dev python3-venv python3-pip
创建一个python虚拟环境并激活它。
$ python3 -m venv /opt/pgadmin/venv
$ source /opt/pgadmin/venv/bin/activate
安装 pgAdmin 和 uWSGI。
(venv) root@postgresql:-$ pip install --upgrade pip
(venv) root@postgresql:-$ pip install --upgrade setuptools
(venv) root@postgresql:-$ pip install wheel
(venv) root@postgresql:-$ pip install pgadmin4
(venv) root@postgresql:-$ pip install uwsgi
运行 pgAdmin 的安装文件。检查路径。 Ubuntu 22.04 默认情况下附带 Python 3.10,因此它在路径中可见。确保您选择正确的路径。
(venv) root@postgresql:-$ python3 /opt/pgadmin/venv/lib/python3.10/site-packages/pgadmin4/setup.py
按照设置说明进行操作,并在此处记下您的电子邮件和密码。
NOTE: Configuring authentication for SERVER mode.
Enter the email address and password to use for the initial pgAdmin user account:
Email address: [email
Password:
Retype password:
pgAdmin 4 - Application Initialisation
======================================
停用虚拟环境。
(venv) root@postgresql:-$ deactivate
切换回普通用户。
(venv) root@postgresql:-$ exit
创建一个新的系统用户 pgadmin
。它将用于运行 pgAdmin 进程。
$ sudo adduser --system --group --home /var/lib/pgadmin --disabled-login --shell /usr/sbin/nologin pgadmin
由于我们将使用 Nginx,因此请将上述目录以及新创建的用户的所有权授予它。
$ sudo chown -R pgadmin:nginx /var/lib/pgadmin /var/log/pgadmin /opt/pgadmin
步骤 7 - 集成 uWSGI 和 pgAdmin
下一步是创建一个监听 UNIX 套接字 /tmp/pgadmin.sock
的 WSGI 服务器。在文件夹 /opt/pgadmin
中创建一个名为 pgadmin-uwsgi.ini
的 uWSGI 配置文件。
$ sudo nano /opt/pgadmin/pgadmin-uwsgi.ini
将以下代码添加到其中。确保路径中的 python 版本与系统中安装的版本匹配。
[uwsgi]
socket = /var/lib/pgadmin/pgadmin4.sock
chdir = /opt/pgadmin/venv/lib/python3.10/site-packages/pgadmin4/
module = pgAdmin4:application
threads = 20
processes = 1
mount = /=pgAdmin4:app
manage-script-name = true
chmod-socket = 660
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 8 步 - 创建服务文件
现在我们已经配置了 pgAdmin 和 uWSGI,我们需要为其创建一个 systemd 服务单元文件。服务文件将允许服务器在启动时自动启动 uWSGI 并为 pgAdmin 4 应用程序提供服务。
创建并打开服务文件进行编辑。
$ sudo nano /etc/systemd/system/pgadmin-uwsgi.service
将以下代码粘贴到其中。
[Unit]
Description=pgadmin4 on uWSGI
Requires=network.target
After=network.target
[Service]
User=pgadmin
Group=nginx
Environment="PATH=/opt/pgadmin/venv/bin"
ExecStart=/opt/pgadmin/venv/bin/uwsgi --ini /opt/pgadmin/pgadmin-uwsgi.ini
[Install]
WantedBy=multi-user.target
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
正如您所看到的,我们选择 nginx
作为运行 pgAdmin 进程的组,因为我们将使用它进行代理。
启用并启动uWSGI服务。
$ sudo systemctl enable pgadmin-uwsgi --now
检查服务的状态。
$ sudo systemctl status pgadmin-uwsgi
第 9 步 - 安装 SSL
在配置Nginx之前,我们需要设置SSL证书。
要使用 Let's Encrypt 安装 SSL 证书,我们需要下载 Certbot 工具。为此,我们将使用 Snapd 软件包安装程序。
安装 Snap 安装程序。
$ sudo apt install snapd
确保您的 Snapd 版本是最新的。
$ sudo snap install core
$ sudo snap refresh core
安装证书机器人。
$ sudo snap install --classic certbot
使用以下命令通过创建指向 /usr/bin
目录的符号链接来确保 Certbot 命令运行。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
停止 Nginx 服务器,因为它会干扰 Certbot 工具。
$ sudo systemctl stop nginx
生成 SSL 证书。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d pgadmin.example.com
上面的命令会将证书下载到服务器上的 /etc/letsencrypt/live/pgadmin.example.com
目录中。
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
为 Let's Encrypt 自动续订创建一个挑战 Web 根目录。
$ sudo mkdir -p /var/lib/letsencrypt
创建 Cron 作业来更新 SSL。它将每天运行以检查证书并在需要时更新它。为此,首先创建文件 /etc/cron.daily/certbot-renew
并打开它进行编辑。
$ sudo nano /etc/cron.daily/certbot-renew
粘贴以下代码。
#!/bin/sh
certbot renew --cert-name pgadmin.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
更改任务文件的权限以使其可执行。
$ sudo chmod +x /etc/cron.daily/certbot-renew
第 10 步 - 安装和配置 Nginx
Ubuntu 附带了旧版本的 Nginx。要安装最新版本,您需要下载官方 Nginx 存储库。
导入 Nginx 的签名密钥。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
添加 Nginx 稳定版本的存储库。
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
更新系统存储库。
$ sudo apt update
安装 Nginx。
$ sudo apt install nginx
验证安装。
$ nginx -v
nginx version: nginx/1.20.2
配置 Nginx
创建并打开文件 /etc/nginx/conf.d/pgadmin.conf
进行编辑。
$ sudo nano /etc/nginx/conf.d/pgadmin.conf
将以下代码粘贴到其中。
server {
listen 80;
listen [::]:80;
server_name pgadmin.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pgadmin.example.com;
ssl_certificate /etc/letsencrypt/live/pgadmin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pgadmin.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/pgadmin.example.com/chain.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 5m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location /pgadmin4/ {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/tmp/pgadmin4.sock;
}
}
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
打开文件 /etc/nginx/nginx.conf
进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在 include /etc/nginx/conf.d/*.conf;
行之前添加以下行。
server_names_hash_bucket_size 64;
按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
验证 Nginx 配置文件语法。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新启动 Nginx 服务以启用新配置。
$ sudo systemctl restart nginx
第 11 步 - 配置防火墙
在访问 pgAdmin 之前,我们需要确保防火墙端口已打开。如果您使用 ufw 防火墙,请运行以下命令打开 HTTP 和 HTTPs 端口。
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
检查防火墙的状态。
$ sudo ufw status
您应该看到类似的输出。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
5432/tcp ALLOW 192.168.1.0/24
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
第 11 步 - 访问和配置 pgAdmin
在访问 pgAdmin 之前,我们需要为默认的 postgres 用户设置密码。
打开 psql shell。
$ sudo -u postgres psql
运行以下命令设置密码。
postgres-# \password postgres
Enter new password for user "postgres":
Enter it again:
退出外壳。
postgres-# exit
另外,更改 UNIX 套接字的所有权。
$ sudo chown nginx:nginx /var/lib/pgadmin/pgadmin4.sock
在浏览器中打开 URL https://pgadmin.example.com
,您将看到以下登录屏幕。
输入在步骤 6 中创建的用户凭据以登录并访问以下仪表板。
下一步是将本地 PostgreSQL 服务器添加到其中。单击添加新服务器按钮即可开始。
为连接命名并切换到连接选项卡。
输入 localhost
作为主机名,并将端口字段留空。添加之前创建的密码并选中保存密码?选项。单击保存按钮完成服务器添加。
完成后,您将看到 PostgreSQL 服务器的以下仪表板屏幕。
让我们创建一个新表并向数据库添加一些数据。
在仪表板上,单击 PostgreSQL - Local 旁边的箭头符号以展开树形菜单。接下来,展开数据库,单击您添加的数据库的名称(在我们的示例中为howtoforge),然后单击架构。您应该看到以下菜单。
右键单击表格选项,然后选择创建>>表格菜单选项,如图所示。
这将打开创建表弹出窗口,如下所示。输入表的名称。
切换到列选项卡。这里我们将为表定义一些基本列。
单击加号添加第一列。我们将其命名为ID,并以整数作为其数据类型。每个表都应该有一个主键。要将 ID 设为表的主键,请切换主键按钮。
接下来,我们为名称添加另一列,其中数据类型为字符变化。为了限制名称长度,我们将其长度定义为 30。目前,这对于我们的示例来说已经足够了。完成创建表后,单击保存按钮。
现在我们已经有了包含一些列的表,下一步是用一些值填充表。要添加数据,请在浏览器中右键单击表名称,将光标移到脚本上,然后选择选项插入脚本 >。
它将在仪表板上打开一个新选项卡,其中包含部分填充的 INSERT
命令。将问号替换为您要填写的相应数据。这是我们用于表格的数据。
INSERT INTO public."table-01"(
"ID", "Name")
VALUES (1, 'Navjot'), (2, Adam), (3, 'Roxy');
单击倾斜的三角形按钮来执行 SQL 查询并添加数据。
接下来,您需要查看刚刚添加的数据。为此,右键单击表名称并选择选项查看/编辑数据,然后单击选项所有行。
这将在仪表板中打开另一个选项卡,您的数据将在下部面板的数据输出选项卡中可见。
您终于创建了一个数据库并使用 pgAdmin 向其中添加了一些数据。使用 pgAdmin 还可以做很多事情。
PostgreSQL 带有内置实用程序来备份和恢复数据。 pgAdmin 本身支持它们,但要使其正常工作,您可能需要添加 Postgre 二进制文件的路径。为此,请打开顶部的文件菜单,然后选择首选项选项。
它将打开一个新的弹出窗口,其中包含许多首选项。从左侧边栏中选择选项路径>>二进制路径。接下来,向下滚动到弹出窗口的 PostgreSQL 二进制路径 部分。
输入 /usr/bin
作为 PostgreSQL 14 服务器条目前面的路径,然后选中其上的复选标记。完成后点击保存按钮。您应该能够通过 pgAdmin 界面使用备份和恢复命令。
结论
您学习了如何在 Ubuntu 22.04 服务器上安装 PostgreSQL 和 pgAdmin。您还配置了 pgAdmin 以连接 PostgreSQL 服务并执行基本操作。如果您有疑问,请在下面的评论中发表。