Skip to content

Commit 9165cc0

Browse files
committed
[MERGE] add support for unix sockets
Merge FRiCKLE#24
2 parents 0560059 + 2a27d93 commit 9165cc0

4 files changed

+27
-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

+9-1
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,19 @@ 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+
pgs->port = u.family == AF_UNIX ? u.default_port : u.port;
446+
pgs->family = u.family;
446447

447448
/* parse various options */
448449
for (i = 2; i < cf->args->nelts; i++) {
449450

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

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;
@@ -330,6 +331,7 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
330331
}
331332

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

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

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

0 commit comments

Comments
 (0)