Skip to content

Commit dc3d3bb

Browse files
author
Andrey Alcheev
committed
Bring in the support of unix sockets and introduce "port" parameter in "postgres_server" directive.
1 parent a9b4dd6 commit dc3d3bb

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ Configuration directives
2525
========================
2626
postgres_server
2727
---------------
28-
* **syntax**: `postgres_server ip[:port] dbname=dbname user=user password=pass`
28+
* **syntax**: `postgres_server {ip[:portnum]|unix:/socket/dir} [port=portnum] [dbname=dbname] [user=user] [password=pass]`
2929
* **default**: `none`
3030
* **context**: `upstream`
3131

32-
Set details about the database server.
32+
Set details about the database server. Additional port parameter is offered to connect to unix socket with alternative port numbers.
3333

3434

3535
postgres_keepalive

src/ngx_postgres_module.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,20 @@ ngx_postgres_conf_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
442442

443443
pgs->addrs = u.addrs;
444444
pgs->naddrs = u.naddrs;
445-
pgs->port = u.port;
445+
if(u.family != AF_UNIX)
446+
pgs->port = u.port;
447+
pgs->family = u.family;
446448

447449
/* parse various options */
448450
for (i = 2; i < cf->args->nelts; i++) {
449451

452+
if (ngx_strncmp(value[i].data, "port=", sizeof("port=") - 1)
453+
== 0)
454+
{
455+
pgs->port = (in_port_t) ngx_atoi(&value[i].data[sizeof("port=") - 1], value[i].len - (sizeof("port=") - 1));
456+
continue;
457+
}
458+
450459
if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)
451460
== 0)
452461
{

src/ngx_postgres_module.h

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ typedef struct {
111111
#endif
112112
ngx_uint_t naddrs;
113113
in_port_t port;
114+
int family;
114115
ngx_str_t dbname;
115116
ngx_str_t user;
116117
ngx_str_t password;
@@ -122,6 +123,7 @@ typedef struct {
122123
ngx_str_t name;
123124
ngx_str_t host;
124125
in_port_t port;
126+
int family;
125127
ngx_str_t dbname;
126128
ngx_str_t user;
127129
ngx_str_t password;

src/ngx_postgres_upstream.c

+14-6
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ ngx_postgres_upstream_init(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *uscf)
9191
peers->peer[n].socklen = server[i].addrs[j].socklen;
9292
peers->peer[n].name = server[i].addrs[j].name;
9393
peers->peer[n].port = server[i].port;
94+
peers->peer[n].family = server[i].family;
9495
peers->peer[n].dbname = server[i].dbname;
9596
peers->peer[n].user = server[i].user;
9697
peers->peer[n].password = server[i].password;
@@ -329,6 +330,7 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
329330
}
330331

331332
/* sizeof("...") - 1 + 1 (for spaces and '\0' omitted */
333+
/* we hope that unix sockets connection string will be always shorter than tcp/ip one (because 'host' is shorter than 'hostaddr') */
332334
len = sizeof("hostaddr=") + peer->host.len
333335
+ sizeof("port=") + sizeof("65535") - 1
334336
+ sizeof("dbname=") + peer->dbname.len
@@ -346,12 +348,18 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
346348
#endif
347349
}
348350

349-
/* TODO add unix sockets */
350-
last = ngx_snprintf(connstring, len - 1,
351-
"hostaddr=%V port=%d dbname=%V user=%V password=%V"
352-
" sslmode=disable",
353-
&peer->host, peer->port, &peer->dbname, &peer->user,
354-
&peer->password);
351+
if(peer->family != AF_UNIX)
352+
last = ngx_snprintf(connstring, len - 1,
353+
"hostaddr=%V port=%d dbname=%V user=%V password=%V"
354+
" sslmode=disable",
355+
&peer->host, peer->port, &peer->dbname, &peer->user,
356+
&peer->password);
357+
else
358+
last = ngx_snprintf(connstring, len - 1,
359+
"host=%s port=%d dbname=%V user=%V password=%V"
360+
" sslmode=disable",
361+
&peer->host.data[5], peer->port, &peer->dbname, &peer->user,
362+
&peer->password);
355363
*last = '\0';
356364

357365
dd("PostgreSQL connection string: %s", connstring);

0 commit comments

Comments
 (0)