Skip to content

Commit 68deeae

Browse files
author
Yaroslaff Fedin
authored
Merge pull request #3 from cryptofuture/konstruxi_ngx_postgres
Build as Dynamic module support; sockets; fixes
2 parents eb678e9 + 022d0bd commit 68deeae

File tree

5 files changed

+65
-108
lines changed

5 files changed

+65
-108
lines changed

Diff for: README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ Configuration directives
4343
========================
4444
postgres_server
4545
---------------
46-
* **syntax**: `postgres_server ip[:port] dbname=dbname user=user password=pass`
46+
* **syntax**: `postgres_server {ip[:portnum]|unix:/socket/dir} [port=portnum] [dbname=dbname] [user=user] [password=pass]`
4747
* **default**: `none`
4848
* **context**: `upstream`
4949

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

5252

5353
postgres_keepalive

Diff for: config

+26-98
Original file line numberDiff line numberDiff line change
@@ -102,27 +102,16 @@ END
102102
exit 1
103103
fi
104104

105-
ngx_version=`grep nginx_version src/core/nginx.h | sed -e 's/^.* \(.*\)$/\1/'`
105+
lib_version=90600
106+
ngx_feature="libpq library version 9.6"
106107

107-
if [ -z "$ngx_version" ]; then
108-
cat << END
109-
$0: error: ngx_postgres addon was unable to detect version of nginx.
110-
END
111-
exit 1
112-
fi
113-
114-
# work-around for versions of nginx older than nginx-0.9.0
115-
if [ $ngx_version -ge 9000 ]; then
116-
ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION"
117-
ngx_feature_run=value
118-
else
119-
ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION_DETECTED"
120-
ngx_feature_run=no
108+
if [ $ngx_found = no ]; then
109+
lib_version=90500
110+
ngx_feature="libpq library version 9.5"
111+
ngx_feature_test="printf(\"%d\", PQlibVersion())"
112+
. auto/feature
121113
fi
122114

123-
lib_version=90500
124-
ngx_feature="libpq library version 9.5"
125-
126115
if [ $ngx_found = no ]; then
127116
lib_version=90400
128117
ngx_feature="libpq library version 9.4"
@@ -151,92 +140,31 @@ if [ $ngx_found = no ]; then
151140
. auto/feature
152141
fi
153142

154-
if [ $ngx_found = no ]; then
155-
lib_version=90000
156-
ngx_feature="libpq library version 9.0"
157-
ngx_feature_test="(void) PQescapeLiteral(NULL, NULL, 0);
158-
printf(\"$lib_version\")"
159-
. auto/feature
160-
fi
161-
162-
if [ $ngx_found = no ]; then
163-
lib_version=80400
164-
ngx_feature="libpq library version 8.4"
165-
ngx_feature_test="PQinitOpenSSL(0, 0);
166-
printf(\"$lib_version\")"
167-
. auto/feature
168-
fi
169-
170-
if [ $ngx_found = no ]; then
171-
lib_version=80300
172-
ngx_feature="libpq library version 8.3"
173-
ngx_feature_test="(void) PQconnectionNeedsPassword(NULL);
174-
printf(\"$lib_version\")"
175-
. auto/feature
176-
fi
177-
178-
if [ $ngx_found = no ]; then
179-
lib_version=80200
180-
ngx_feature="libpq library version 8.2"
181-
ngx_feature_test="(void) PQsendDescribePortal(NULL, NULL);
182-
printf(\"$lib_version\")"
183-
. auto/feature
184-
fi
185-
186-
if [ $ngx_found = no ]; then
187-
lib_version=80104
188-
ngx_feature="libpq library version 8.1.4"
189-
ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);
190-
(void) PQregisterThreadLock(NULL);
191-
printf(\"$lib_version\")"
192-
. auto/feature
193-
fi
194-
195-
if [ $ngx_found = no ]; then
196-
lib_version=80100
197-
ngx_feature="libpq library version 8.1.0"
198-
ngx_feature_test="(void) PQregisterThreadLock(NULL);
199-
printf(\"$lib_version\")"
200-
. auto/feature
201-
fi
202-
203-
if [ $ngx_found = no ]; then
204-
lib_version=80008
205-
ngx_feature="libpq library version 8.0.8"
206-
ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);
207-
(void) PQcancel(NULL, NULL, 0);
208-
printf(\"$lib_version\")"
209-
. auto/feature
210-
fi
211-
212-
if [ $ngx_found = no ]; then
213-
lib_version=80000
214-
ngx_feature="libpq library version 8.0.0"
215-
ngx_feature_test="(void) PQcancel(NULL, NULL, 0);
216-
printf(\"$lib_version\")"
217-
. auto/feature
218-
fi
219-
220143
if [ $ngx_found = no ]; then
221144
cat << END
222145
$0: error: ngx_postgres addon was unable to detect version of the libpq library.
223146
END
224147
exit 1
225148
fi
226149

227-
# work-around for versions of nginx older than nginx-0.9.0
228-
if [ $ngx_version -lt 9000 ]; then
229-
have=NGX_POSTGRES_LIBRARY_VERSION value=$lib_version . auto/define
230-
fi
231-
232-
ngx_addon_name=ngx_postgres
233-
234-
HTTP_MODULES="$HTTP_MODULES ngx_postgres_module"
150+
ngx_addon_name=ngx_postgres_module
151+
NGX_SRCS="$ngx_addon_dir/src/ngx_postgres_escape.c $ngx_addon_dir/src/ngx_postgres_handler.c $ngx_addon_dir/src/ngx_postgres_keepalive.c $ngx_addon_dir/src/ngx_postgres_module.c $ngx_addon_dir/src/ngx_postgres_output.c $ngx_addon_dir/src/ngx_postgres_processor.c $ngx_addon_dir/src/ngx_postgres_rewrite.c $ngx_addon_dir/src/ngx_postgres_upstream.c $ngx_addon_dir/src/ngx_postgres_util.c $ngx_addon_dir/src/ngx_postgres_variable.c"
152+
NGX_DEPS="$ngx_addon_dir/src/ngx_postgres_escape.h $ngx_addon_dir/src/ngx_postgres_handler.h $ngx_addon_dir/src/ngx_postgres_keepalive.h $ngx_addon_dir/src/ngx_postgres_module.h $ngx_addon_dir/src/ngx_postgres_output.h $ngx_addon_dir/src/ngx_postgres_processor.h $ngx_addon_dir/src/ngx_postgres_rewrite.h $ngx_addon_dir/src/ngx_postgres_upstream.h $ngx_addon_dir/src/ngx_postgres_util.h $ngx_addon_dir/src/ngx_postgres_variable.h $ngx_addon_dir/src/ngx_postgres_ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h"
235153

236-
CORE_INCS="$CORE_INCS $ngx_feature_path"
237-
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
238-
239-
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_postgres_escape.c $ngx_addon_dir/src/ngx_postgres_handler.c $ngx_addon_dir/src/ngx_postgres_keepalive.c $ngx_addon_dir/src/ngx_postgres_module.c $ngx_addon_dir/src/ngx_postgres_output.c $ngx_addon_dir/src/ngx_postgres_processor.c $ngx_addon_dir/src/ngx_postgres_rewrite.c $ngx_addon_dir/src/ngx_postgres_upstream.c $ngx_addon_dir/src/ngx_postgres_util.c $ngx_addon_dir/src/ngx_postgres_variable.c"
240-
NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ngx_postgres_escape.h $ngx_addon_dir/src/ngx_postgres_handler.h $ngx_addon_dir/src/ngx_postgres_keepalive.h $ngx_addon_dir/src/ngx_postgres_module.h $ngx_addon_dir/src/ngx_postgres_output.h $ngx_addon_dir/src/ngx_postgres_processor.h $ngx_addon_dir/src/ngx_postgres_rewrite.h $ngx_addon_dir/src/ngx_postgres_upstream.h $ngx_addon_dir/src/ngx_postgres_util.h $ngx_addon_dir/src/ngx_postgres_variable.h $ngx_addon_dir/src/ngx_postgres_ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h"
154+
if test -n "$ngx_module_link"; then
155+
ngx_module_type=HTTP
156+
ngx_module_name=ngx_postgres_module
157+
ngx_module_srcs="$NGX_SRCS"
158+
ngx_module_deps="$NGX_DEPS"
159+
ngx_module_libs="$ngx_feature_libs"
160+
ngx_module_incs="$ngx_feature_path"
161+
. auto/module
162+
else
163+
HTTP_MODULES="$HTTP_MODULES ngx_postgres_module"
164+
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $NGX_SRCS"
165+
NGX_ADDON_DEPS="$NGX_ADDON_DEPS $NGX_DEPS"
166+
CORE_INCS="$CORE_INCS $ngx_feature_path"
167+
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
168+
fi
241169

242-
have=NGX_POSTGRES_MODULE . auto/have
170+
have=NGX_POSTGRES_MODULE . auto/have

Diff for: src/ngx_postgres_module.c

+19-2
Original file line numberDiff line numberDiff line change
@@ -446,11 +446,19 @@ ngx_postgres_conf_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
446446

447447
pgs->addrs = u.addrs;
448448
pgs->naddrs = u.naddrs;
449-
pgs->port = u.port;
449+
pgs->port = u.family == AF_UNIX ? u.default_port : u.port;
450+
pgs->family = u.family;
450451

451452
/* parse various options */
452453
for (i = 2; i < cf->args->nelts; i++) {
453454

455+
if (ngx_strncmp(value[i].data, "port=", sizeof("port=") - 1)
456+
== 0)
457+
{
458+
pgs->port = (in_port_t) ngx_atoi(&value[i].data[sizeof("port=") - 1], value[i].len - (sizeof("port=") - 1));
459+
continue;
460+
}
461+
454462
if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)
455463
== 0)
456464
{
@@ -1314,13 +1322,22 @@ ngx_postgres_find_upstream(ngx_http_request_t *r, ngx_url_t *url)
13141322
dd("host doesn't match");
13151323
continue;
13161324
}
1317-
1325+
1326+
#if (nginx_version < 1011006)
13181327
if (uscfp[i]->port != url->port) {
13191328
dd("port doesn't match: %d != %d",
13201329
(int) uscfp[i]->port, (int) url->port);
13211330
continue;
13221331
}
13231332

1333+
if (uscfp[i]->default_port && url->default_port
1334+
&& (uscfp[i]->default_port != url->default_port))
1335+
{
1336+
dd("default_port doesn't match");
1337+
continue;
1338+
}
1339+
1340+
#endif
13241341
dd("returning");
13251342
return uscfp[i];
13261343
}

Diff for: src/ngx_postgres_module.h

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ typedef struct {
112112
#endif
113113
ngx_uint_t naddrs;
114114
in_port_t port;
115+
int family;
115116
ngx_str_t dbname;
116117
ngx_str_t user;
117118
ngx_str_t password;
@@ -123,6 +124,7 @@ typedef struct {
123124
ngx_str_t name;
124125
ngx_str_t host;
125126
in_port_t port;
127+
int family;
126128
ngx_str_t dbname;
127129
ngx_str_t user;
128130
ngx_str_t password;

Diff for: src/ngx_postgres_upstream.c

+16-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,7 +331,10 @@ 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
336+
+ sizeof("port=") + sizeof("65535") - 1
337+
+ sizeof("dbname=") + peer->dbname.len
334338
+ sizeof("port=") + sizeof("65535") - 1
335339
+ sizeof("dbname=") + peer->dbname.len
336340
+ sizeof("user=") + peer->user.len
@@ -347,12 +351,18 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
347351
#endif
348352
}
349353

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);
354+
if(peer->family != AF_UNIX)
355+
last = ngx_snprintf(connstring, len - 1,
356+
"hostaddr=%V port=%d dbname=%V user=%V password=%V"
357+
" sslmode=disable",
358+
&peer->host, peer->port, &peer->dbname, &peer->user,
359+
&peer->password);
360+
else
361+
last = ngx_snprintf(connstring, len - 1,
362+
"host=%s port=%d dbname=%V user=%V password=%V"
363+
" sslmode=disable",
364+
&peer->host.data[5], peer->port, &peer->dbname, &peer->user,
365+
&peer->password);
356366
*last = '\0';
357367

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

0 commit comments

Comments
 (0)