在Ubuntu上安装PostgreSQL并设置远程访问的步骤如下:
由于在启动PostgreSQL服务器方面遇到了一些问题,我在这里做个备忘录。
操作系统:Ubuntu14.04 LTS
安装
一开始要安装PostgreSQL。
只需要使用apt-get命令就可以安装,没有什么特别需要注意的事项。
$ sudo apt-get update
$ sudo apt-get install -y postgresql-9.3
如果成功安装,应该会在/etc/init.d/目录下生成启动脚本。
可以使用start命令启动服务器,但这样还无法连接上。
$ /etc/init.d/postgresql start
* Starting PostgreSQL 9.3 database server [ OK ]
$ /etc/init.d/postgresql status
9.3/main (port 5432): online
$ psql
psql: FATAL: role "root" does not exist
因为在这里我们使用超级用户root连接到数据库,所以收到了”角色root不存在”的错误提示。
设置卷的设定
PostgreSQL使用角色(role)来管理权限。
角色类似于UNIX中的组(group),可以设置对每个数据库的访问或覆写权限。
制作这个角色有两种方式。
有一种方式是使用用户名为postgres登录到PostgreSQL,然后更改角色的设置。
还有一种方法是使用Shell命令createuser。
这个命令是在安装PostgreSQL的同时设置的,只需输入createuser name,就会创建一个名为name的角色。
我只想解释其中一种方法。
一旦成功安装后,将会创建名为”postgres”的用户和对应的角色。
默认情况下,”postgres”角色是PostgreSQL的超级用户,并具有修改角色设置的权限。
切换到postgres账户,并登录到PostgreSQL服务器上。
$ su - postgres
$ psql
psql (9.3.5)
Type "help" for help.
postgres=#
如果直接使用psql命令而不提供用户名和数据库名,将使用与操作系统用户同名的用户和数据库。因此,上面的psql命令与psql –username=postgres –dbname=postgres具有相同的意义。与root不同,这次确实可以登录,因为存在名为postgres的角色。
可以使用以下命令来查看现在登录状态下的现有角色:SELECT rolname FROM pg_roles;或\du命令。默认情况下,没有其他角色,唯一的角色是超级用户postgres。
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication | {}
在中文中,只需要一種選擇:
不建立其他角色,直接使用超級用戶postgres來創建和運營數據庫是完全可行的,但是由於安全原因,直接使用超級用戶登錄並不理想,所以建立除超級用戶以外的角色仍然更加方便。
创建新的角色可以使用”CREATE ROLE name;”或者”CREATE USER name;”命令来进行创建。尽管在创建后也可以更改角色的属性,但可以使用以下关键字在创建时添加属性。
-
- LOGIN
-
- SUPERUSER
-
- CREATEDB
-
- CREATEROLE
-
- REPLICATION
- PASSWORD
这里有关于属性的详细说明:
https://www.postgresql.jp/document/9.3/html/role-attributes.html
首先,创建一个名为hellopsql的角色,并添加LOGIN CREATEDB PASSWORD属性。
postgres=# CREATE ROLE hellopsql LOGIN CREATEDB PASSWORD 'hello';
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
hellopsql | Create DB | {}
postgres | Superuser, Create role, Create DB, Replication | {}
使用此指令已创建了账户名为hellopsql、密码为hello的角色。
我希望立即使用hellopsql的角色登录,但由于还没有创建可以访问的数据库,所以下一步我想开始创建数据库。
创建数据库
在创建数据库的过程中,有两种方法可供选择。
一种方法是使用PostgreSQL的Shell来使用CREATE DATABASE命令创建数据库。
另一个选项是使用与安装同时设置的shell命令”createdb”来创建数据库。
另外,如果您想要确认已创建的数据库,您可以使用PostgreSQL的Shell命令SELECT datname FROM pg_database;或者使用\l命令来进行确认。
postgres=# CREATE DATABASE hellopsql OWNER hellopsql;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-----------+-----------+---------+-------+-----------------------
hellopsql | hellopsql | SQL_ASCII | C | C |
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
用这个,就已经准备好了角色和数据库了。
稍后只需输入psql –username=hellopsql –password –dbname=hellopsql的命令,应该就可以连接上了。
如果出现类似以下Peer错误,请进一步修改客户端验证设置。
$ psql --username=hellopsql --password --dbname=hellopsql
Password for user hellopsql:
psql: FATAL: Peer authentication failed for user "hellopsql"
设置客户端认证
这是类似于iptables的东西。可以进行各种设置,如允许来自哪个IP、哪个用户的连接,使用什么身份验证方式等。
在默认设置中,从本地进行的连接方式是通过ident进行的,因此用于登录的用户名必须与当前客户端操作系统中的用户名相同。换句话说,如果想要使用hellopsql进行连接,就必须在操作系统中创建一个名为hellopsql的用户,并使用该用户进行连接。
因为默认设置很不方便,所以我想要修改一次/etc/postgresql/9.3/main/ph_hba.conf的设置。
不提供详细说明,但如果您想了解更多,请参考以下网站:
https://www.postgresql.jp/document/9.3/html/auth-pg-hba-conf.html
http://qa.atmarkit.co.jp/q/2604
$ vi /etc/postgresql/9.3/main/pg_hba.conf
顺便提一下,我的配置文件大致如下。
# TYPE DATABASE USER ADDRESS METHOD
# ローカルから且つスーパーユーザの接続はpeer認証を使います
local all postgres peer
# ローカルから且つスーパーユーザ以外の接続を無条件で通す
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# リモートから且つスーパーユーザの接続を拒否します
host all postgres 0.0.0.0/0 reject
# TCP connections by md5
host all all 0.0.0.0/0 md5
修改设置后,使用 “/etc/init.d/postgresql restart” 重新启动服务器。
$ /etc/init.d/postgresql restart
* Restarting PostgreSQL 9.3 database server [ OK ]
远程连接
如果想要远程操作,需要修改/etc/postgresql/9.3/main/postgresql.conf配置文件,因为默认配置不允许远程连接。
$ vi /etc/postgresql/9.3/main/postgresql.conf
请找到listen_addresses字段,并将其更改如下。
listen_addresses='*'
如果更改了设置,将通过 /etc/init.d/postgresql restart 命令进行重新启动。
$ /etc/init.d/postgresql restart
* Restarting PostgreSQL 9.3 database server [ OK ]