annotate src/stream/ngx_stream_proxy_module.c @ 7397:860d3907da1c

Upstream: revised upstream response time variables. Variables now do not depend on presence of the HTTP status code in response. If the corresponding event occurred, variables contain time between request creation and the event, and "-" otherwise. Previously, intermediate value of the $upstream_response_time variable held unix timestamp.
author Vladimir Homutov <vl@nginx.com>
date Wed, 21 Nov 2018 13:40:40 +0300
parents 4698cede59ff
children 6d4bc025c5a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13 typedef struct {
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
14 ngx_addr_t *addr;
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
15 ngx_stream_complex_value_t *value;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
16 #if (NGX_HAVE_TRANSPARENT_PROXY)
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
17 ngx_uint_t transparent; /* unsigned transparent:1; */
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
18 #endif
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
19 } ngx_stream_upstream_local_t;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
20
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
21
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
22 typedef struct {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 ngx_msec_t connect_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24 ngx_msec_t timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 ngx_msec_t next_upstream_timeout;
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
26 size_t buffer_size;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
27 size_t upload_rate;
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
28 size_t download_rate;
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
29 ngx_uint_t requests;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
30 ngx_uint_t responses;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 ngx_uint_t next_upstream_tries;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 ngx_flag_t next_upstream;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
33 ngx_flag_t proxy_protocol;
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
34 ngx_stream_upstream_local_t *local;
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
35 ngx_flag_t socket_keepalive;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 ngx_flag_t ssl_enable;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39 ngx_flag_t ssl_session_reuse;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40 ngx_uint_t ssl_protocols;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 ngx_str_t ssl_ciphers;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
42 ngx_stream_complex_value_t *ssl_name;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 ngx_flag_t ssl_server_name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 ngx_flag_t ssl_verify;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 ngx_uint_t ssl_verify_depth;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 ngx_str_t ssl_trusted_certificate;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 ngx_str_t ssl_crl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 ngx_str_t ssl_certificate;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 ngx_str_t ssl_certificate_key;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 ngx_array_t *ssl_passwords;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 ngx_ssl_t *ssl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 ngx_stream_upstream_srv_conf_t *upstream;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
57 ngx_stream_complex_value_t *upstream_value;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 } ngx_stream_proxy_srv_conf_t;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 static void ngx_stream_proxy_handler(ngx_stream_session_t *s);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
62 static ngx_int_t ngx_stream_proxy_eval(ngx_stream_session_t *s,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
63 ngx_stream_proxy_srv_conf_t *pscf);
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
64 static ngx_int_t ngx_stream_proxy_set_local(ngx_stream_session_t *s,
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
65 ngx_stream_upstream_t *u, ngx_stream_upstream_local_t *local);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 static void ngx_stream_proxy_connect(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
68 static void ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69 static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
70 static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev);
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
71 static void ngx_stream_proxy_process_connection(ngx_event_t *ev,
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
72 ngx_uint_t from_upstream);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
73 static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
75 static void ngx_stream_proxy_process(ngx_stream_session_t *s,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76 ngx_uint_t from_upstream, ngx_uint_t do_write);
7392
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
77 static ngx_int_t ngx_stream_proxy_test_finalize(ngx_stream_session_t *s,
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
78 ngx_uint_t from_upstream);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79 static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
80 static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82 size_t len);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84 static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
85 static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
86 void *child);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
87 static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
88 void *conf);
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
89 static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
90 void *conf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
93
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
94 static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
95 static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
96 ngx_command_t *cmd, void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97 static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
98 static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc);
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
99 static void ngx_stream_proxy_ssl_save_session(ngx_connection_t *c);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100 static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 ngx_stream_proxy_srv_conf_t *pscf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 static ngx_conf_bitmask_t ngx_stream_proxy_ssl_protocols[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
6981
08dc60979133 SSL: added support for TLSv1.3 in ssl_protocols directive.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6868
diff changeset
111 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112 { ngx_null_string, 0 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117
6217
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
118 static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_downstream_buffer = {
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
119 ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size"
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
120 };
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
121
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
122 static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_upstream_buffer = {
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
123 ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size"
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
124 };
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
125
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
126
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127 static ngx_command_t ngx_stream_proxy_commands[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
128
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
129 { ngx_string("proxy_pass"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
130 NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
131 ngx_stream_proxy_pass,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
132 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
133 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
134 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
135
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
136 { ngx_string("proxy_bind"),
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
137 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12,
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
138 ngx_stream_proxy_bind,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
139 NGX_STREAM_SRV_CONF_OFFSET,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
140 0,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
141 NULL },
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
142
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
143 { ngx_string("proxy_socket_keepalive"),
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
144 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
145 ngx_conf_set_flag_slot,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
146 NGX_STREAM_SRV_CONF_OFFSET,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
147 offsetof(ngx_stream_proxy_srv_conf_t, socket_keepalive),
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
148 NULL },
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
149
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150 { ngx_string("proxy_connect_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154 offsetof(ngx_stream_proxy_srv_conf_t, connect_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157 { ngx_string("proxy_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
158 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
159 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
160 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
161 offsetof(ngx_stream_proxy_srv_conf_t, timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
162 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
163
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
164 { ngx_string("proxy_buffer_size"),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
165 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
166 ngx_conf_set_size_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
167 NGX_STREAM_SRV_CONF_OFFSET,
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
168 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
169 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
170
6217
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
171 { ngx_string("proxy_downstream_buffer"),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
172 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
173 ngx_conf_set_size_slot,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
174 NGX_STREAM_SRV_CONF_OFFSET,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
175 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
176 &ngx_conf_deprecated_proxy_downstream_buffer },
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
177
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
178 { ngx_string("proxy_upstream_buffer"),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
179 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
180 ngx_conf_set_size_slot,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
181 NGX_STREAM_SRV_CONF_OFFSET,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
182 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
183 &ngx_conf_deprecated_proxy_upstream_buffer },
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
184
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
185 { ngx_string("proxy_upload_rate"),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
186 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
187 ngx_conf_set_size_slot,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
188 NGX_STREAM_SRV_CONF_OFFSET,
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
189 offsetof(ngx_stream_proxy_srv_conf_t, upload_rate),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
190 NULL },
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
191
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
192 { ngx_string("proxy_download_rate"),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
193 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
194 ngx_conf_set_size_slot,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
195 NGX_STREAM_SRV_CONF_OFFSET,
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
196 offsetof(ngx_stream_proxy_srv_conf_t, download_rate),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
197 NULL },
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
198
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
199 { ngx_string("proxy_requests"),
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
200 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
201 ngx_conf_set_num_slot,
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
202 NGX_STREAM_SRV_CONF_OFFSET,
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
203 offsetof(ngx_stream_proxy_srv_conf_t, requests),
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
204 NULL },
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
205
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
206 { ngx_string("proxy_responses"),
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
207 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
208 ngx_conf_set_num_slot,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
209 NGX_STREAM_SRV_CONF_OFFSET,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
210 offsetof(ngx_stream_proxy_srv_conf_t, responses),
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
211 NULL },
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
212
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213 { ngx_string("proxy_next_upstream"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
214 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
215 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
217 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
219
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
220 { ngx_string("proxy_next_upstream_tries"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
222 ngx_conf_set_num_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_tries),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227 { ngx_string("proxy_next_upstream_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
231 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
234 { ngx_string("proxy_protocol"),
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
235 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
236 ngx_conf_set_flag_slot,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
237 NGX_STREAM_SRV_CONF_OFFSET,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
238 offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol),
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
239 NULL },
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
240
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
242
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243 { ngx_string("proxy_ssl"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
244 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
245 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
247 offsetof(ngx_stream_proxy_srv_conf_t, ssl_enable),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
248 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
249
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
250 { ngx_string("proxy_ssl_session_reuse"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
251 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
252 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
253 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
254 offsetof(ngx_stream_proxy_srv_conf_t, ssl_session_reuse),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
255 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
256
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
257 { ngx_string("proxy_ssl_protocols"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
258 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
259 ngx_conf_set_bitmask_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
260 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
261 offsetof(ngx_stream_proxy_srv_conf_t, ssl_protocols),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
262 &ngx_stream_proxy_ssl_protocols },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
263
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
264 { ngx_string("proxy_ssl_ciphers"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
265 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
266 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
267 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
268 offsetof(ngx_stream_proxy_srv_conf_t, ssl_ciphers),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
269 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
270
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
271 { ngx_string("proxy_ssl_name"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
272 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
273 ngx_stream_set_complex_value_slot,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
274 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
275 offsetof(ngx_stream_proxy_srv_conf_t, ssl_name),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
276 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
277
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
278 { ngx_string("proxy_ssl_server_name"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
279 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
280 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
281 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
282 offsetof(ngx_stream_proxy_srv_conf_t, ssl_server_name),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
283 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
284
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
285 { ngx_string("proxy_ssl_verify"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
286 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
287 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
288 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
289 offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
290 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
291
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
292 { ngx_string("proxy_ssl_verify_depth"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
293 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
294 ngx_conf_set_num_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
295 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
296 offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify_depth),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
297 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
298
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
299 { ngx_string("proxy_ssl_trusted_certificate"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
300 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
301 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
302 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
303 offsetof(ngx_stream_proxy_srv_conf_t, ssl_trusted_certificate),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
304 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
305
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
306 { ngx_string("proxy_ssl_crl"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
307 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
308 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
309 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
310 offsetof(ngx_stream_proxy_srv_conf_t, ssl_crl),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
311 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
312
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
313 { ngx_string("proxy_ssl_certificate"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
314 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
315 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
316 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
317 offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
318 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
319
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
320 { ngx_string("proxy_ssl_certificate_key"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
321 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
322 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
323 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
324 offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate_key),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
325 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
326
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
327 { ngx_string("proxy_ssl_password_file"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
328 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
329 ngx_stream_proxy_ssl_password_file,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
330 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
331 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
332 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
333
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
334 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
335
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
336 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
337 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
338
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
339
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
340 static ngx_stream_module_t ngx_stream_proxy_module_ctx = {
6606
2f41d383c9c7 Stream: added preconfiguration step.
Vladimir Homutov <vl@nginx.com>
parents: 6599
diff changeset
341 NULL, /* preconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6157
diff changeset
342 NULL, /* postconfiguration */
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6157
diff changeset
343
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
344 NULL, /* create main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
345 NULL, /* init main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
346
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
347 ngx_stream_proxy_create_srv_conf, /* create server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
348 ngx_stream_proxy_merge_srv_conf /* merge server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
349 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
350
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
351
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
352 ngx_module_t ngx_stream_proxy_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
353 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
354 &ngx_stream_proxy_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
355 ngx_stream_proxy_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
356 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
357 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
358 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
359 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
360 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
361 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
362 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
363 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
364 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
365 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
366
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
367
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
368 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 ngx_stream_proxy_handler(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
370 {
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
371 u_char *p;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
372 ngx_str_t *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
373 ngx_uint_t i;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
374 ngx_connection_t *c;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
375 ngx_resolver_ctx_t *ctx, temp;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
376 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
377 ngx_stream_core_srv_conf_t *cscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
378 ngx_stream_proxy_srv_conf_t *pscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
379 ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
380 ngx_stream_upstream_main_conf_t *umcf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
381
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
382 c = s->connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
383
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
384 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
385
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
386 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
387 "proxy connection handler");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
388
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
389 u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
390 if (u == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
391 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
392 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
393 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
394
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
395 s->upstream = u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
396
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
397 s->log_handler = ngx_stream_proxy_log_error;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
398
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
399 u->requests = 1;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
400
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
401 u->peer.log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
402 u->peer.log_error = NGX_ERROR_ERR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
403
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
404 if (ngx_stream_proxy_set_local(s, u, pscf->local) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
405 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
406 return;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
407 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
408
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
409 if (pscf->socket_keepalive) {
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
410 u->peer.so_keepalive = 1;
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
411 }
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
412
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
413 u->peer.type = c->type;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
414 u->start_sec = ngx_time();
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
415
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
416 c->write->handler = ngx_stream_proxy_downstream_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
417 c->read->handler = ngx_stream_proxy_downstream_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
418
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
419 s->upstream_states = ngx_array_create(c->pool, 1,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
420 sizeof(ngx_stream_upstream_state_t));
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
421 if (s->upstream_states == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
422 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
423 return;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
424 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
425
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
426 p = ngx_pnalloc(c->pool, pscf->buffer_size);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
427 if (p == NULL) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
428 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
429 return;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
430 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
431
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
432 u->downstream_buf.start = p;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
433 u->downstream_buf.end = p + pscf->buffer_size;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
434 u->downstream_buf.pos = p;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
435 u->downstream_buf.last = p;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
436
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
437 if (c->read->ready) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
438 ngx_post_event(c->read, &ngx_posted_events);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
439 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
440
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
441 if (pscf->upstream_value) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
442 if (ngx_stream_proxy_eval(s, pscf) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
443 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
444 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
445 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
446 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
447
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
448 if (u->resolved == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
449
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
450 uscf = pscf->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
451
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
452 } else {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
453
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
454 #if (NGX_STREAM_SSL)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
455 u->ssl_name = u->resolved->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
456 #endif
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
457
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
458 host = &u->resolved->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
459
6786
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
460 umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module);
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
461
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
462 uscfp = umcf->upstreams.elts;
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
463
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
464 for (i = 0; i < umcf->upstreams.nelts; i++) {
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
465
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
466 uscf = uscfp[i];
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
467
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
468 if (uscf->host.len == host->len
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
469 && ((uscf->port == 0 && u->resolved->no_port)
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
470 || uscf->port == u->resolved->port)
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
471 && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
472 {
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
473 goto found;
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
474 }
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
475 }
906ac20234ed Upstream: do not unnecessarily create per-request upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 6785
diff changeset
476
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
477 if (u->resolved->sockaddr) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
478
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
479 if (u->resolved->port == 0
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
480 && u->resolved->sockaddr->sa_family != AF_UNIX)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
481 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
482 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
483 "no port in upstream \"%V\"", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
484 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
485 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
486 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
487
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
488 if (ngx_stream_upstream_create_round_robin_peer(s, u->resolved)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
489 != NGX_OK)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
490 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
491 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
492 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
493 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
494
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
495 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
496
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
497 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
498 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
499
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
500 if (u->resolved->port == 0) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
501 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
502 "no port in upstream \"%V\"", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
503 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
504 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
505 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
506
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
507 temp.name = *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
508
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
509 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
510
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
511 ctx = ngx_resolve_start(cscf->resolver, &temp);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
512 if (ctx == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
513 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
514 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
515 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
516
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
517 if (ctx == NGX_NO_RESOLVER) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
518 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
519 "no resolver defined to resolve %V", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
520 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
521 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
522 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
523
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
524 ctx->name = *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
525 ctx->handler = ngx_stream_proxy_resolve_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
526 ctx->data = s;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
527 ctx->timeout = cscf->resolver_timeout;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
528
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
529 u->resolved->ctx = ctx;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
530
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
531 if (ngx_resolve_name(ctx) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
532 u->resolved->ctx = NULL;
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
533 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
534 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
535 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
536
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
537 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
538 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
539
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
540 found:
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
541
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
542 if (uscf == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
543 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "no upstream configuration");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
544 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
545 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
546 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
547
6703
edcd9303a4d3 Upstream: introduced u->upstream.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6692
diff changeset
548 u->upstream = uscf;
edcd9303a4d3 Upstream: introduced u->upstream.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6692
diff changeset
549
6648
d43ee392e825 Stream: fixed build without stream_ssl_module (ticket #1032).
Vladimir Homutov <vl@nginx.com>
parents: 6643
diff changeset
550 #if (NGX_STREAM_SSL)
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
551 u->ssl_name = uscf->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
552 #endif
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
553
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
554 if (uscf->peer.init(s, uscf) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
555 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
556 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
557 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
558
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
559 u->peer.start_time = ngx_current_msec;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
560
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
561 if (pscf->next_upstream_tries
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
562 && u->peer.tries > pscf->next_upstream_tries)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
563 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
564 u->peer.tries = pscf->next_upstream_tries;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
565 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
566
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
567 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
568 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
569
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
570
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
571 static ngx_int_t
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
572 ngx_stream_proxy_eval(ngx_stream_session_t *s,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
573 ngx_stream_proxy_srv_conf_t *pscf)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
574 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
575 ngx_str_t host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
576 ngx_url_t url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
577 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
578
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
579 if (ngx_stream_complex_value(s, pscf->upstream_value, &host) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
580 return NGX_ERROR;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
581 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
582
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
583 ngx_memzero(&url, sizeof(ngx_url_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
584
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
585 url.url = host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
586 url.no_resolve = 1;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
587
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
588 if (ngx_parse_url(s->connection->pool, &url) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
589 if (url.err) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
590 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
591 "%s in upstream \"%V\"", url.err, &url.url);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
592 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
593
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
594 return NGX_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
595 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
596
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
597 u = s->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
598
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
599 u->resolved = ngx_pcalloc(s->connection->pool,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
600 sizeof(ngx_stream_upstream_resolved_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
601 if (u->resolved == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
602 return NGX_ERROR;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
603 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
604
6784
1af120241cde Upstream: removed unnecessary condition in proxy_eval() and friends.
Ruslan Ermilov <ru@nginx.com>
parents: 6777
diff changeset
605 if (url.addrs) {
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
606 u->resolved->sockaddr = url.addrs[0].sockaddr;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
607 u->resolved->socklen = url.addrs[0].socklen;
6785
d1d0dd69a419 Upstream: added the ngx_http_upstream_resolved_t.name field.
Ruslan Ermilov <ru@nginx.com>
parents: 6784
diff changeset
608 u->resolved->name = url.addrs[0].name;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
609 u->resolved->naddrs = 1;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
610 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
611
6785
d1d0dd69a419 Upstream: added the ngx_http_upstream_resolved_t.name field.
Ruslan Ermilov <ru@nginx.com>
parents: 6784
diff changeset
612 u->resolved->host = url.host;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
613 u->resolved->port = url.port;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
614 u->resolved->no_port = url.no_port;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
615
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
616 return NGX_OK;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
617 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
618
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
619
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
620 static ngx_int_t
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
621 ngx_stream_proxy_set_local(ngx_stream_session_t *s, ngx_stream_upstream_t *u,
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
622 ngx_stream_upstream_local_t *local)
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
623 {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
624 ngx_int_t rc;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
625 ngx_str_t val;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
626 ngx_addr_t *addr;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
627
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
628 if (local == NULL) {
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
629 u->peer.local = NULL;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
630 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
631 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
632
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
633 #if (NGX_HAVE_TRANSPARENT_PROXY)
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
634 u->peer.transparent = local->transparent;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
635 #endif
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
636
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
637 if (local->value == NULL) {
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
638 u->peer.local = local->addr;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
639 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
640 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
641
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
642 if (ngx_stream_complex_value(s, local->value, &val) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
643 return NGX_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
644 }
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
645
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
646 if (val.len == 0) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
647 return NGX_OK;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
648 }
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
649
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
650 addr = ngx_palloc(s->connection->pool, sizeof(ngx_addr_t));
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
651 if (addr == NULL) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
652 return NGX_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
653 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
654
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
655 rc = ngx_parse_addr_port(s->connection->pool, addr, val.data, val.len);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
656 if (rc == NGX_ERROR) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
657 return NGX_ERROR;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
658 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
659
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
660 if (rc != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
661 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
662 "invalid local address \"%V\"", &val);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
663 return NGX_OK;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
664 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
665
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
666 addr->name = val;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
667 u->peer.local = addr;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
668
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
669 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
670 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
671
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
672
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
673 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
674 ngx_stream_proxy_connect(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
675 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
676 ngx_int_t rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
677 ngx_connection_t *c, *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
678 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
679 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
680
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
681 c = s->connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
682
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
683 c->log->action = "connecting to upstream";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
684
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
685 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
686
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
687 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
688
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
689 u->connected = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
690 u->proxy_protocol = pscf->proxy_protocol;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
691
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
692 if (u->state) {
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
693 u->state->response_time = ngx_current_msec - u->start_time;
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
694 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
695
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
696 u->state = ngx_array_push(s->upstream_states);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
697 if (u->state == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
698 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
699 return;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
700 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
701
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
702 ngx_memzero(u->state, sizeof(ngx_stream_upstream_state_t));
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
703
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
704 u->start_time = ngx_current_msec;
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
705
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
706 u->state->connect_time = (ngx_msec_t) -1;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
707 u->state->first_byte_time = (ngx_msec_t) -1;
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
708 u->state->response_time = (ngx_msec_t) -1;
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
709
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
710 rc = ngx_event_connect_peer(&u->peer);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
711
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
712 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connect: %i", rc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
713
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
714 if (rc == NGX_ERROR) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
715 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
716 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
717 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
718
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
719 u->state->peer = u->peer.name;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
720
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
721 if (rc == NGX_BUSY) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
722 ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
723 ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
724 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
725 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
726
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
727 if (rc == NGX_DECLINED) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
728 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
729 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
730 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
731
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
732 /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
733
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
734 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
735
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
736 pc->data = s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
737 pc->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
738 pc->pool = c->pool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
739 pc->read->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
740 pc->write->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
741
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
742 if (rc != NGX_AGAIN) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
743 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
744 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
745 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
746
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
747 pc->read->handler = ngx_stream_proxy_connect_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
748 pc->write->handler = ngx_stream_proxy_connect_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
749
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
750 ngx_add_timer(pc->write, pscf->connect_timeout);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
751 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
752
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
753
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
754 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
755 ngx_stream_proxy_init_upstream(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
756 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
757 u_char *p;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
758 ngx_chain_t *cl;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
759 ngx_connection_t *c, *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
760 ngx_log_handler_pt handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
761 ngx_stream_upstream_t *u;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
762 ngx_stream_core_srv_conf_t *cscf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
763 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
764
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
765 u = s->upstream;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
766 pc = u->peer.connection;
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
767
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
768 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
769
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
770 if (pc->type == SOCK_STREAM
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
771 && cscf->tcp_nodelay
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6981
diff changeset
772 && ngx_tcp_nodelay(pc) != NGX_OK)
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
773 {
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6981
diff changeset
774 ngx_stream_proxy_next_upstream(s);
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6981
diff changeset
775 return;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
776 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
777
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
778 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
779
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
780 #if (NGX_STREAM_SSL)
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
781
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
782 if (pc->type == SOCK_STREAM && pscf->ssl) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
783
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
784 if (u->proxy_protocol) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
785 if (ngx_stream_proxy_send_proxy_protocol(s) != NGX_OK) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
786 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
787 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
788
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
789 u->proxy_protocol = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
790 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
791
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
792 if (pc->ssl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
793 ngx_stream_proxy_ssl_init_connection(s);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
794 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
795 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
796 }
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
797
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
798 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
799
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
800 c = s->connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
801
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
802 if (c->log->log_level >= NGX_LOG_INFO) {
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
803 ngx_str_t str;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
804 u_char addr[NGX_SOCKADDR_STRLEN];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
805
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
806 str.len = NGX_SOCKADDR_STRLEN;
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
807 str.data = addr;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
808
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
809 if (ngx_connection_local_sockaddr(pc, &str, 1) == NGX_OK) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
810 handler = c->log->handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
811 c->log->handler = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
812
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
813 ngx_log_error(NGX_LOG_INFO, c->log, 0,
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
814 "%sproxy %V connected to %V",
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
815 pc->type == SOCK_DGRAM ? "udp " : "",
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
816 &str, u->peer.name);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
817
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
818 c->log->handler = handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
819 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
820 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
821
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
822 u->state->connect_time = ngx_current_msec - u->start_time;
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
823
6863
54cf51c4f07a Stream: speed up TCP peer recovery.
Roman Arutyunyan <arut@nginx.com>
parents: 6786
diff changeset
824 if (u->peer.notify) {
54cf51c4f07a Stream: speed up TCP peer recovery.
Roman Arutyunyan <arut@nginx.com>
parents: 6786
diff changeset
825 u->peer.notify(&u->peer, u->peer.data,
54cf51c4f07a Stream: speed up TCP peer recovery.
Roman Arutyunyan <arut@nginx.com>
parents: 6786
diff changeset
826 NGX_STREAM_UPSTREAM_NOTIFY_CONNECT);
54cf51c4f07a Stream: speed up TCP peer recovery.
Roman Arutyunyan <arut@nginx.com>
parents: 6786
diff changeset
827 }
54cf51c4f07a Stream: speed up TCP peer recovery.
Roman Arutyunyan <arut@nginx.com>
parents: 6786
diff changeset
828
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
829 if (u->upstream_buf.start == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
830 p = ngx_pnalloc(c->pool, pscf->buffer_size);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
831 if (p == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
832 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
833 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
834 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
835
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
836 u->upstream_buf.start = p;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
837 u->upstream_buf.end = p + pscf->buffer_size;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
838 u->upstream_buf.pos = p;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
839 u->upstream_buf.last = p;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
840 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
841
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
842 if (c->buffer && c->buffer->pos < c->buffer->last) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
843 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
844 "stream proxy add preread buffer: %uz",
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
845 c->buffer->last - c->buffer->pos);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
846
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
847 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
848 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
849 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
850 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
851 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
852
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
853 *cl->buf = *c->buffer;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
854
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
855 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
856 cl->buf->flush = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
857
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
858 cl->next = u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
859 u->upstream_out = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
860 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
861
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
862 if (u->proxy_protocol) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
863 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
864 "stream proxy add PROXY protocol header");
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
865
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
866 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
867 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
868 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
869 return;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
870 }
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
871
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
872 p = ngx_pnalloc(c->pool, NGX_PROXY_PROTOCOL_MAX_HEADER);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
873 if (p == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
874 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
875 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
876 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
877
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
878 cl->buf->pos = p;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
879
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
880 p = ngx_proxy_protocol_write(c, p, p + NGX_PROXY_PROTOCOL_MAX_HEADER);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
881 if (p == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
882 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
883 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
884 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
885
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
886 cl->buf->last = p;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
887 cl->buf->temporary = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
888 cl->buf->flush = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
889 cl->buf->last_buf = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
890 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
891
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
892 cl->next = u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
893 u->upstream_out = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
894
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
895 u->proxy_protocol = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
896 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
897
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
898 u->connected = 1;
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
899
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
900 pc->read->handler = ngx_stream_proxy_upstream_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
901 pc->write->handler = ngx_stream_proxy_upstream_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
902
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
903 if (pc->read->ready) {
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
904 ngx_post_event(pc->read, &ngx_posted_events);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
905 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
906
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
907 ngx_stream_proxy_process(s, 0, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
908 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
909
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
910
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
911 #if (NGX_STREAM_SSL)
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
912
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
913 static ngx_int_t
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
914 ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s)
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
915 {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
916 u_char *p;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
917 ssize_t n, size;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
918 ngx_connection_t *c, *pc;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
919 ngx_stream_upstream_t *u;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
920 ngx_stream_proxy_srv_conf_t *pscf;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
921 u_char buf[NGX_PROXY_PROTOCOL_MAX_HEADER];
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
922
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
923 c = s->connection;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
924
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
925 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
926 "stream proxy send PROXY protocol header");
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
927
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
928 p = ngx_proxy_protocol_write(c, buf, buf + NGX_PROXY_PROTOCOL_MAX_HEADER);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
929 if (p == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
930 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
931 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
932 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
933
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
934 u = s->upstream;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
935
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
936 pc = u->peer.connection;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
937
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
938 size = p - buf;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
939
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
940 n = pc->send(pc, buf, size);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
941
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
942 if (n == NGX_AGAIN) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
943 if (ngx_handle_write_event(pc->write, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
944 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
945 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
946 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
947
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
948 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
949
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
950 ngx_add_timer(pc->write, pscf->timeout);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
951
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
952 pc->write->handler = ngx_stream_proxy_connect_handler;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
953
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
954 return NGX_AGAIN;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
955 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
956
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
957 if (n == NGX_ERROR) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
958 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
959 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
960 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
961
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
962 if (n != size) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
963
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
964 /*
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
965 * PROXY protocol specification:
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
966 * The sender must always ensure that the header
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
967 * is sent at once, so that the transport layer
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
968 * maintains atomicity along the path to the receiver.
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
969 */
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
970
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
971 ngx_log_error(NGX_LOG_ERR, c->log, 0,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
972 "could not send PROXY protocol header at once");
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
973
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
974 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
975
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
976 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
977 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
978
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
979 return NGX_OK;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
980 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
981
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
982
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
983 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
984 ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
985 void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
986 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
987 ngx_stream_proxy_srv_conf_t *pscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
988
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
989 ngx_str_t *value;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
990
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
991 if (pscf->ssl_passwords != NGX_CONF_UNSET_PTR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
992 return "is duplicate";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
993 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
994
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
995 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
996
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
997 pscf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
998
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
999 if (pscf->ssl_passwords == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1000 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1001 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1002
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1003 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1004 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1005
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1006
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1007 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1008 ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1009 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1010 ngx_int_t rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1011 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1012 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1013 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1014
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1015 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1016
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1017 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1018
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1019 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1020
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1021 if (ngx_ssl_create_connection(pscf->ssl, pc, NGX_SSL_BUFFER|NGX_SSL_CLIENT)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1022 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1023 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1024 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1025 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1026 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1027
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1028 if (pscf->ssl_server_name || pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1029 if (ngx_stream_proxy_ssl_name(s) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1030 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1031 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1032 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1033 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1034
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1035 if (pscf->ssl_session_reuse) {
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1036 pc->ssl->save_session = ngx_stream_proxy_ssl_save_session;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1037
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1038 if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1039 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1040 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1041 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1042 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1043
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1044 s->connection->log->action = "SSL handshaking to upstream";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1045
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1046 rc = ngx_ssl_handshake(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1047
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1048 if (rc == NGX_AGAIN) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1049
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1050 if (!pc->write->timer_set) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1051 ngx_add_timer(pc->write, pscf->connect_timeout);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1052 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1053
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1054 pc->ssl->handler = ngx_stream_proxy_ssl_handshake;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1055 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1056 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1057
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1058 ngx_stream_proxy_ssl_handshake(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1059 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1060
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1061
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1062 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1063 ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1064 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1065 long rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1066 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1067 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1068 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1069
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1070 s = pc->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1071
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1072 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1073
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1074 if (pc->ssl->handshaked) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1075
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1076 if (pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1077 rc = SSL_get_verify_result(pc->ssl->connection);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1078
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1079 if (rc != X509_V_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1080 ngx_log_error(NGX_LOG_ERR, pc->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1081 "upstream SSL certificate verify error: (%l:%s)",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1082 rc, X509_verify_cert_error_string(rc));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1083 goto failed;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1084 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1085
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1086 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1087
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1088 if (ngx_ssl_check_host(pc, &u->ssl_name) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1089 ngx_log_error(NGX_LOG_ERR, pc->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1090 "upstream SSL certificate does not match \"%V\"",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1091 &u->ssl_name);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1092 goto failed;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1093 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1094 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1095
6258
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1096 if (pc->write->timer_set) {
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1097 ngx_del_timer(pc->write);
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1098 }
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1099
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1100 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1101
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1102 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1103 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1104
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1105 failed:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1106
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1107 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1108 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1109
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1110
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1111 static void
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1112 ngx_stream_proxy_ssl_save_session(ngx_connection_t *c)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1113 {
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1114 ngx_stream_session_t *s;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1115 ngx_stream_upstream_t *u;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1116
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1117 s = c->data;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1118 u = s->upstream;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1119
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1120 u->peer.save_session(&u->peer, u->peer.data);
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1121 }
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1122
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
1123
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1124 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1125 ngx_stream_proxy_ssl_name(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1126 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1127 u_char *p, *last;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1128 ngx_str_t name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1129 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1130 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1131
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1132 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1133
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1134 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1135
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1136 if (pscf->ssl_name) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1137 if (ngx_stream_complex_value(s, pscf->ssl_name, &name) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1138 return NGX_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1139 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1140
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1141 } else {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1142 name = u->ssl_name;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1143 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1144
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1145 if (name.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1146 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1147 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1148
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1149 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1150 * ssl name here may contain port, strip it for compatibility
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1151 * with the http module
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1152 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1153
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1154 p = name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1155 last = name.data + name.len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1156
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1157 if (*p == '[') {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1158 p = ngx_strlchr(p, last, ']');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1159
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1160 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1161 p = name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1162 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1163 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1164
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1165 p = ngx_strlchr(p, last, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1166
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1167 if (p != NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1168 name.len = p - name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1169 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1170
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1171 if (!pscf->ssl_server_name) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1172 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1173 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1174
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1175 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1176
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1177 /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1178
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1179 if (name.len == 0 || *name.data == '[') {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1180 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1181 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1182
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1183 if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1184 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1185 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1186
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1187 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1188 * SSL_set_tlsext_host_name() needs a null-terminated string,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1189 * hence we explicitly null-terminate name here
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1190 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1191
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1192 p = ngx_pnalloc(s->connection->pool, name.len + 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1193 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1194 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1195 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1196
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1197 (void) ngx_cpystrn(p, name.data, name.len + 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1198
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1199 name.data = p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1200
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1201 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1202 "upstream SSL server name: \"%s\"", name.data);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1203
6777
563a1ee345a4 SSL: compatibility with BoringSSL.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6703
diff changeset
1204 if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection,
563a1ee345a4 SSL: compatibility with BoringSSL.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6703
diff changeset
1205 (char *) name.data)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1206 == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1207 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1208 ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1209 "SSL_set_tlsext_host_name(\"%s\") failed", name.data);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1210 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1211 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1212
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1213 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1214
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1215 done:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1216
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1217 u->ssl_name = name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1218
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1219 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1220 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1221
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1222 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1223
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1224
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1225 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1226 ngx_stream_proxy_downstream_handler(ngx_event_t *ev)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1227 {
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1228 ngx_stream_proxy_process_connection(ev, ev->write);
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1229 }
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1230
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1231
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1232 static void
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1233 ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1234 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1235 ngx_stream_session_t *s;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1236 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1237 ngx_stream_proxy_srv_conf_t *pscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1238 ngx_stream_upstream_resolved_t *ur;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1239
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1240 s = ctx->data;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1241
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1242 u = s->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1243 ur = u->resolved;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1244
6648
d43ee392e825 Stream: fixed build without stream_ssl_module (ticket #1032).
Vladimir Homutov <vl@nginx.com>
parents: 6643
diff changeset
1245 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1246 "stream upstream resolve");
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1247
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1248 if (ctx->state) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1249 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1250 "%V could not be resolved (%i: %s)",
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1251 &ctx->name, ctx->state,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1252 ngx_resolver_strerror(ctx->state));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1253
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1254 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1255 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1256 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1257
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1258 ur->naddrs = ctx->naddrs;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1259 ur->addrs = ctx->addrs;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1260
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1261 #if (NGX_DEBUG)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1262 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1263 u_char text[NGX_SOCKADDR_STRLEN];
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1264 ngx_str_t addr;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1265 ngx_uint_t i;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1266
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1267 addr.data = text;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1268
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1269 for (i = 0; i < ctx->naddrs; i++) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1270 addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1271 text, NGX_SOCKADDR_STRLEN, 0);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1272
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1273 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1274 "name was resolved to %V", &addr);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1275 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1276 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1277 #endif
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1278
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1279 if (ngx_stream_upstream_create_round_robin_peer(s, ur) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1280 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1281 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1282 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1283
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1284 ngx_resolve_name_done(ctx);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1285 ur->ctx = NULL;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1286
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1287 u->peer.start_time = ngx_current_msec;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1288
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1289 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1290
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1291 if (pscf->next_upstream_tries
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1292 && u->peer.tries > pscf->next_upstream_tries)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1293 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1294 u->peer.tries = pscf->next_upstream_tries;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1295 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1296
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1297 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1298 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1299
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1300
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1301 static void
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1302 ngx_stream_proxy_upstream_handler(ngx_event_t *ev)
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1303 {
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1304 ngx_stream_proxy_process_connection(ev, !ev->write);
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1305 }
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1306
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1307
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1308 static void
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1309 ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream)
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1310 {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1311 ngx_connection_t *c, *pc;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1312 ngx_log_handler_pt handler;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1313 ngx_stream_session_t *s;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1314 ngx_stream_upstream_t *u;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1315 ngx_stream_proxy_srv_conf_t *pscf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1316
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1317 c = ev->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1318 s = c->data;
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1319 u = s->upstream;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1320
7156
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1321 if (c->close) {
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1322 ngx_log_error(NGX_LOG_INFO, c->log, 0, "shutdown timeout");
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1323 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1324 return;
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1325 }
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7105
diff changeset
1326
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1327 c = s->connection;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1328 pc = u->peer.connection;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1329
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1330 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1331
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1332 if (ev->timedout) {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1333 ev->timedout = 0;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1334
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1335 if (ev->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1336 ev->delayed = 0;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1337
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1338 if (!ev->ready) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1339 if (ngx_handle_read_event(ev, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1340 ngx_stream_proxy_finalize(s,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1341 NGX_STREAM_INTERNAL_SERVER_ERROR);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1342 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1343 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1344
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1345 if (u->connected && !c->read->delayed && !pc->read->delayed) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1346 ngx_add_timer(c->write, pscf->timeout);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1347 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1348
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1349 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1350 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1351
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1352 } else {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1353 if (s->connection->type == SOCK_DGRAM) {
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1354
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1355 if (pscf->responses == NGX_MAX_INT32_VALUE
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1356 || (u->responses >= pscf->responses * u->requests))
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1357 {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1358
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1359 /*
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1360 * successfully terminate timed out UDP session
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1361 * if expected number of responses was received
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1362 */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1363
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1364 handler = c->log->handler;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1365 c->log->handler = NULL;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1366
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1367 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1368 "udp timed out"
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1369 ", packets from/to client:%ui/%ui"
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1370 ", bytes from/to client:%O/%O"
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1371 ", bytes from/to upstream:%O/%O",
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1372 u->requests, u->responses,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1373 s->received, c->sent, u->received,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1374 pc ? pc->sent : 0);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1375
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1376 c->log->handler = handler;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1377
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1378 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1379 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1380 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1381
7105
0846dd76a487 Stream: fixed logging UDP upstream timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7098
diff changeset
1382 ngx_connection_error(pc, NGX_ETIMEDOUT, "upstream timed out");
0846dd76a487 Stream: fixed logging UDP upstream timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7098
diff changeset
1383
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1384 pc->read->error = 1;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1385
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1386 ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1387
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1388 return;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1389 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1390
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1391 ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out");
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1392
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1393 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1394
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1395 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1396 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1397
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1398 } else if (ev->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1399
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1400 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1401 "stream connection delayed");
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1402
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1403 if (ngx_handle_read_event(ev, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1404 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1405 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1406
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1407 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1408 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1409
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
1410 if (from_upstream && !u->connected) {
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1411 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1412 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1413
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1414 ngx_stream_proxy_process(s, from_upstream, ev->write);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1415 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1416
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1417
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1418 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1419 ngx_stream_proxy_connect_handler(ngx_event_t *ev)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1420 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1421 ngx_connection_t *c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1422 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1423
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1424 c = ev->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1425 s = c->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1426
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1427 if (ev->timedout) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1428 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "upstream timed out");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1429 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1430 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1431 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1432
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1433 ngx_del_timer(c->write);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1434
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1435 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1436 "stream proxy connect upstream");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1437
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1438 if (ngx_stream_proxy_test_connect(c) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1439 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1440 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1441 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1442
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1443 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1444 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1445
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1446
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1447 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1448 ngx_stream_proxy_test_connect(ngx_connection_t *c)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1449 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1450 int err;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1451 socklen_t len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1452
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1453 #if (NGX_HAVE_KQUEUE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1454
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1455 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1456 err = c->write->kq_errno ? c->write->kq_errno : c->read->kq_errno;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1457
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1458 if (err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1459 (void) ngx_connection_error(c, err,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1460 "kevent() reported that connect() failed");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1461 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1462 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1463
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1464 } else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1465 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1466 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1467 err = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1468 len = sizeof(int);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1469
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1470 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1471 * BSDs and Linux return 0 and set a pending error in err
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1472 * Solaris returns -1 and sets errno
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1473 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1474
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1475 if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1476 == -1)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1477 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1478 err = ngx_socket_errno;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1479 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1480
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1481 if (err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1482 (void) ngx_connection_error(c, err, "connect() failed");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1483 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1484 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1485 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1486
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1487 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1488 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1489
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1490
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1491 static void
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1492 ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1493 ngx_uint_t do_write)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1494 {
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1495 char *recv_action, *send_action;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1496 off_t *received, limit;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1497 size_t size, limit_rate;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1498 ssize_t n;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1499 ngx_buf_t *b;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1500 ngx_int_t rc;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1501 ngx_uint_t flags, *packets;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1502 ngx_msec_t delay;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1503 ngx_chain_t *cl, **ll, **out, **busy;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1504 ngx_connection_t *c, *pc, *src, *dst;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1505 ngx_log_handler_pt handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1506 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1507 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1508
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1509 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1510
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1511 c = s->connection;
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
1512 pc = u->connected ? u->peer.connection : NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1513
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1514 if (c->type == SOCK_DGRAM && (ngx_terminate || ngx_exiting)) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1515
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1516 /* socket is already closed on worker shutdown */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1517
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1518 handler = c->log->handler;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1519 c->log->handler = NULL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1520
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1521 ngx_log_error(NGX_LOG_INFO, c->log, 0, "disconnected on shutdown");
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1522
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1523 c->log->handler = handler;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1524
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1525 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1526 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1527 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1528
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1529 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1530
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1531 if (from_upstream) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1532 src = pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1533 dst = c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1534 b = &u->upstream_buf;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1535 limit_rate = pscf->download_rate;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1536 received = &u->received;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1537 packets = &u->responses;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1538 out = &u->downstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1539 busy = &u->downstream_busy;
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1540 recv_action = "proxying and reading from upstream";
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1541 send_action = "proxying and sending to client";
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1542
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1543 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1544 src = c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1545 dst = pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1546 b = &u->downstream_buf;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1547 limit_rate = pscf->upload_rate;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1548 received = &s->received;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1549 packets = &u->requests;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1550 out = &u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1551 busy = &u->upstream_busy;
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1552 recv_action = "proxying and reading from client";
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1553 send_action = "proxying and sending to upstream";
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1554 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1555
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1556 for ( ;; ) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1557
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1558 if (do_write && dst) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1559
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1560 if (*out || *busy || dst->buffered) {
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1561 c->log->action = send_action;
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1562
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1563 rc = ngx_stream_top_filter(s, *out, from_upstream);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1564
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1565 if (rc == NGX_ERROR) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1566 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1567 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1568 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1569
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1570 ngx_chain_update_chains(c->pool, &u->free, busy, out,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1571 (ngx_buf_tag_t) &ngx_stream_proxy_module);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1572
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1573 if (*busy == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1574 b->pos = b->start;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1575 b->last = b->start;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1576 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1577 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1578 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1579
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1580 size = b->end - b->last;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1581
6868
ee3645078759 Stream: avoid infinite loop in case of socket read error.
Vladimir Homutov <vl@nginx.com>
parents: 6863
diff changeset
1582 if (size && src->read->ready && !src->read->delayed
ee3645078759 Stream: avoid infinite loop in case of socket read error.
Vladimir Homutov <vl@nginx.com>
parents: 6863
diff changeset
1583 && !src->read->error)
ee3645078759 Stream: avoid infinite loop in case of socket read error.
Vladimir Homutov <vl@nginx.com>
parents: 6863
diff changeset
1584 {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1585 if (limit_rate) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1586 limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1587 - *received;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1588
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1589 if (limit <= 0) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1590 src->read->delayed = 1;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1591 delay = (ngx_msec_t) (- limit * 1000 / limit_rate + 1);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1592 ngx_add_timer(src->read, delay);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1593 break;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1594 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1595
6204
114d1f8cdcab Stream: fixed possible integer overflow in rate limiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6203
diff changeset
1596 if ((off_t) size > limit) {
6203
fdfdcad62875 Stream: fixed MSVC compilation warning.
Roman Arutyunyan <arut@nginx.com>
parents: 6202
diff changeset
1597 size = (size_t) limit;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1598 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1599 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1600
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1601 c->log->action = recv_action;
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1602
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1603 n = src->recv(src, b->last, size);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1604
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1605 if (n == NGX_AGAIN) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1606 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1607 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1608
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1609 if (n == NGX_ERROR) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1610 src->read->eof = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1611 n = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1612 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1613
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1614 if (n >= 0) {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1615 if (limit_rate) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1616 delay = (ngx_msec_t) (n * 1000 / limit_rate);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1617
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1618 if (delay > 0) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1619 src->read->delayed = 1;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1620 ngx_add_timer(src->read, delay);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1621 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1622 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1623
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1624 if (from_upstream) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1625 if (u->state->first_byte_time == (ngx_msec_t) -1) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1626 u->state->first_byte_time = ngx_current_msec
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
1627 - u->start_time;
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1628 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1629 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1630
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1631 for (ll = out; *ll; ll = &(*ll)->next) { /* void */ }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1632
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1633 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1634 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1635 ngx_stream_proxy_finalize(s,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1636 NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1637 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1638 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1639
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1640 *ll = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1641
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1642 cl->buf->pos = b->last;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1643 cl->buf->last = b->last + n;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1644 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1645
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1646 cl->buf->temporary = (n ? 1 : 0);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1647 cl->buf->last_buf = src->read->eof;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1648 cl->buf->flush = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1649
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1650 (*packets)++;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1651 *received += n;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1652 b->last += n;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1653 do_write = 1;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1654
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1655 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1656 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1657 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1658
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1659 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1660 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1661
7250
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1662 c->log->action = "proxying connection";
ec4d95eed062 Stream: set action before each recv/send while proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7174
diff changeset
1663
7392
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1664 if (ngx_stream_proxy_test_finalize(s, from_upstream) == NGX_OK) {
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1665 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1666 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1667
6124
f1f222db290b Stream: prevent repeated event notifications after eof.
Roman Arutyunyan <arut@nginx.com>
parents: 6115
diff changeset
1668 flags = src->read->eof ? NGX_CLOSE_EVENT : 0;
f1f222db290b Stream: prevent repeated event notifications after eof.
Roman Arutyunyan <arut@nginx.com>
parents: 6115
diff changeset
1669
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1670 if (!src->shared && ngx_handle_read_event(src->read, flags) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1671 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1672 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1673 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1674
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1675 if (dst) {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1676 if (!dst->shared && ngx_handle_write_event(dst->write, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1677 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1678 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1679 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1680
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1681 if (!c->read->delayed && !pc->read->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1682 ngx_add_timer(c->write, pscf->timeout);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1683
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1684 } else if (c->write->timer_set) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1685 ngx_del_timer(c->write);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1686 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1687 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1688 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1689
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1690
7392
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1691 static ngx_int_t
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1692 ngx_stream_proxy_test_finalize(ngx_stream_session_t *s,
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1693 ngx_uint_t from_upstream)
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1694 {
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1695 ngx_connection_t *c, *pc;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1696 ngx_log_handler_pt handler;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1697 ngx_stream_upstream_t *u;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1698 ngx_stream_proxy_srv_conf_t *pscf;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1699
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1700 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1701
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1702 c = s->connection;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1703 u = s->upstream;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1704 pc = u->connected ? u->peer.connection : NULL;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1705
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1706 if (c->type == SOCK_DGRAM) {
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1707
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1708 if (pscf->requests && u->requests < pscf->requests) {
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1709 return NGX_DECLINED;
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1710 }
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1711
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1712 if (pscf->requests) {
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1713 ngx_delete_udp_connection(c);
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1714 }
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1715
7392
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1716 if (pscf->responses == NGX_MAX_INT32_VALUE
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1717 || u->responses < pscf->responses * u->requests)
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1718 {
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1719 return NGX_DECLINED;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1720 }
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1721
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1722 if (pc == NULL || c->buffered || pc->buffered) {
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1723 return NGX_DECLINED;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1724 }
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1725
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1726 handler = c->log->handler;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1727 c->log->handler = NULL;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1728
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1729 ngx_log_error(NGX_LOG_INFO, c->log, 0,
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1730 "udp done"
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1731 ", packets from/to client:%ui/%ui"
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1732 ", bytes from/to client:%O/%O"
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1733 ", bytes from/to upstream:%O/%O",
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1734 u->requests, u->responses,
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1735 s->received, c->sent, u->received, pc ? pc->sent : 0);
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1736
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1737 c->log->handler = handler;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1738
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1739 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1740
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1741 return NGX_OK;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1742 }
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1743
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1744 /* c->type == SOCK_STREAM */
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1745
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1746 if (pc == NULL
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1747 || (!c->read->eof && !pc->read->eof)
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1748 || (!c->read->eof && c->buffered)
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1749 || (!pc->read->eof && pc->buffered))
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1750 {
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1751 return NGX_DECLINED;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1752 }
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1753
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1754 handler = c->log->handler;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1755 c->log->handler = NULL;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1756
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1757 ngx_log_error(NGX_LOG_INFO, c->log, 0,
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1758 "%s disconnected"
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1759 ", bytes from/to client:%O/%O"
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1760 ", bytes from/to upstream:%O/%O",
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1761 from_upstream ? "upstream" : "client",
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1762 s->received, c->sent, u->received, pc ? pc->sent : 0);
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1763
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1764 c->log->handler = handler;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1765
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1766 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1767
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1768 return NGX_OK;
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1769 }
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1770
04ff25798002 Stream: session completion check code moved to a separate function.
Vladimir Homutov <vl@nginx.com>
parents: 7371
diff changeset
1771
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1772 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1773 ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1774 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1775 ngx_msec_t timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1776 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1777 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1778 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1779
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1780 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1781 "stream proxy next upstream");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1782
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1783 u = s->upstream;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1784 pc = u->peer.connection;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1785
7098
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1786 if (pc && pc->buffered) {
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1787 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
7098
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1788 "buffered data on next upstream");
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1789 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1790 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1791 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1792
7098
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1793 if (s->connection->type == SOCK_DGRAM) {
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1794 u->upstream_out = NULL;
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1795 }
7bfbf73db920 Stream: relaxed next upstream condition (ticket #1317).
Roman Arutyunyan <arut@nginx.com>
parents: 7007
diff changeset
1796
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1797 if (u->peer.sockaddr) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1798 u->peer.free(&u->peer, u->peer.data, NGX_PEER_FAILED);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1799 u->peer.sockaddr = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1800 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1801
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1802 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1803
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1804 timeout = pscf->next_upstream_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1805
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1806 if (u->peer.tries == 0
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1807 || !pscf->next_upstream
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1808 || (timeout && ngx_current_msec - u->peer.start_time >= timeout))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1809 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1810 ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1811 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1812 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1813
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1814 if (pc) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1815 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1816 "close proxy upstream connection: %d", pc->fd);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1817
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1818 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1819 if (pc->ssl) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1820 pc->ssl->no_wait_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1821 pc->ssl->no_send_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1822
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1823 (void) ngx_ssl_shutdown(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1824 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1825 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1826
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1827 u->state->bytes_received = u->received;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1828 u->state->bytes_sent = pc->sent;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1829
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1830 ngx_close_connection(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1831 u->peer.connection = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1832 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1833
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1834 ngx_stream_proxy_connect(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1835 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1836
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1837
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1838 static void
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1839 ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1840 {
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1841 ngx_uint_t state;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1842 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1843 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1844
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1845 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1846 "finalize stream proxy: %i", rc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1847
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1848 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1849
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1850 if (u == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1851 goto noupstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1852 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1853
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1854 if (u->resolved && u->resolved->ctx) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1855 ngx_resolve_name_done(u->resolved->ctx);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1856 u->resolved->ctx = NULL;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1857 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1858
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1859 pc = u->peer.connection;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1860
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1861 if (u->state) {
7397
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
1862 if (u->state->response_time == (ngx_msec_t) -1) {
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
1863 u->state->response_time = ngx_current_msec - u->start_time;
860d3907da1c Upstream: revised upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 7393
diff changeset
1864 }
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1865
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1866 if (pc) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1867 u->state->bytes_received = u->received;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1868 u->state->bytes_sent = pc->sent;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1869 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1870 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1871
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1872 if (u->peer.free && u->peer.sockaddr) {
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1873 state = 0;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1874
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1875 if (pc && pc->type == SOCK_DGRAM
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1876 && (pc->read->error || pc->write->error))
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1877 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1878 state = NGX_PEER_FAILED;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1879 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1880
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7250
diff changeset
1881 u->peer.free(&u->peer, u->peer.data, state);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1882 u->peer.sockaddr = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1883 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1884
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1885 if (pc) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1886 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1887 "close stream proxy upstream connection: %d", pc->fd);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1888
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1889 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1890 if (pc->ssl) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1891 pc->ssl->no_wait_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1892 (void) ngx_ssl_shutdown(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1893 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1894 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1895
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1896 ngx_close_connection(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1897 u->peer.connection = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1898 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1899
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1900 noupstream:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1901
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1902 ngx_stream_finalize_session(s, rc);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1903 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1904
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1905
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1906 static u_char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1907 ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, size_t len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1908 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1909 u_char *p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1910 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1911 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1912 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1913
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1914 s = log->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1915
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1916 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1917
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1918 p = buf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1919
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1920 if (u->peer.name) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1921 p = ngx_snprintf(p, len, ", upstream: \"%V\"", u->peer.name);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1922 len -= p - buf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1923 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1924
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1925 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1926
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1927 p = ngx_snprintf(p, len,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1928 ", bytes from/to client:%O/%O"
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1929 ", bytes from/to upstream:%O/%O",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1930 s->received, s->connection->sent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1931 u->received, pc ? pc->sent : 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1932
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1933 return p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1934 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1935
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1936
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1937 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1938 ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1939 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1940 ngx_stream_proxy_srv_conf_t *conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1941
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1942 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_proxy_srv_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1943 if (conf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1944 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1945 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1946
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1947 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1948 * set by ngx_pcalloc():
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1949 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1950 * conf->ssl_protocols = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1951 * conf->ssl_ciphers = { 0, NULL };
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1952 * conf->ssl_name = NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1953 * conf->ssl_trusted_certificate = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1954 * conf->ssl_crl = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1955 * conf->ssl_certificate = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1956 * conf->ssl_certificate_key = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1957 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1958 * conf->ssl = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1959 * conf->upstream = NULL;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1960 * conf->upstream_value = NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1961 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1962
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1963 conf->connect_timeout = NGX_CONF_UNSET_MSEC;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1964 conf->timeout = NGX_CONF_UNSET_MSEC;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1965 conf->next_upstream_timeout = NGX_CONF_UNSET_MSEC;
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
1966 conf->buffer_size = NGX_CONF_UNSET_SIZE;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1967 conf->upload_rate = NGX_CONF_UNSET_SIZE;
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1968 conf->download_rate = NGX_CONF_UNSET_SIZE;
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
1969 conf->requests = NGX_CONF_UNSET_UINT;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1970 conf->responses = NGX_CONF_UNSET_UINT;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1971 conf->next_upstream_tries = NGX_CONF_UNSET_UINT;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1972 conf->next_upstream = NGX_CONF_UNSET;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
1973 conf->proxy_protocol = NGX_CONF_UNSET;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
1974 conf->local = NGX_CONF_UNSET_PTR;
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
1975 conf->socket_keepalive = NGX_CONF_UNSET;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1976
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1977 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1978 conf->ssl_enable = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1979 conf->ssl_session_reuse = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1980 conf->ssl_server_name = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1981 conf->ssl_verify = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1982 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1983 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1984 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1985
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1986 return conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1987 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1988
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1989
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1990 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1991 ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1992 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1993 ngx_stream_proxy_srv_conf_t *prev = parent;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1994 ngx_stream_proxy_srv_conf_t *conf = child;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1995
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1996 ngx_conf_merge_msec_value(conf->connect_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1997 prev->connect_timeout, 60000);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1998
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1999 ngx_conf_merge_msec_value(conf->timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2000 prev->timeout, 10 * 60000);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2001
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2002 ngx_conf_merge_msec_value(conf->next_upstream_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2003 prev->next_upstream_timeout, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2004
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
2005 ngx_conf_merge_size_value(conf->buffer_size,
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
2006 prev->buffer_size, 16384);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2007
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
2008 ngx_conf_merge_size_value(conf->upload_rate,
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
2009 prev->upload_rate, 0);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
2010
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
2011 ngx_conf_merge_size_value(conf->download_rate,
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
2012 prev->download_rate, 0);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
2013
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
2014 ngx_conf_merge_uint_value(conf->requests,
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
2015 prev->requests, 0);
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7392
diff changeset
2016
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
2017 ngx_conf_merge_uint_value(conf->responses,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
2018 prev->responses, NGX_MAX_INT32_VALUE);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
2019
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2020 ngx_conf_merge_uint_value(conf->next_upstream_tries,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2021 prev->next_upstream_tries, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2022
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2023 ngx_conf_merge_value(conf->next_upstream, prev->next_upstream, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2024
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
2025 ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
2026
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2027 ngx_conf_merge_ptr_value(conf->local, prev->local, NULL);
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2028
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
2029 ngx_conf_merge_value(conf->socket_keepalive,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
2030 prev->socket_keepalive, 0);
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7320
diff changeset
2031
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2032 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2033
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2034 ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2035
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2036 ngx_conf_merge_value(conf->ssl_session_reuse,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2037 prev->ssl_session_reuse, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2038
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2039 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
6157
b2899e7d0ef8 Disabled SSLv3 by default (ticket #653).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6124
diff changeset
2040 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
b2899e7d0ef8 Disabled SSLv3 by default (ticket #653).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6124
diff changeset
2041 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2042
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2043 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, "DEFAULT");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2044
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2045 if (conf->ssl_name == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2046 conf->ssl_name = prev->ssl_name;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2047 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2048
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2049 ngx_conf_merge_value(conf->ssl_server_name, prev->ssl_server_name, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2050
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2051 ngx_conf_merge_value(conf->ssl_verify, prev->ssl_verify, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2052
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2053 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2054 prev->ssl_verify_depth, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2055
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2056 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2057 prev->ssl_trusted_certificate, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2058
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2059 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2060
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2061 ngx_conf_merge_str_value(conf->ssl_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2062 prev->ssl_certificate, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2063
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2064 ngx_conf_merge_str_value(conf->ssl_certificate_key,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2065 prev->ssl_certificate_key, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2066
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2067 ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2068
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2069 if (conf->ssl_enable && ngx_stream_proxy_set_ssl(cf, conf) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2070 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2071 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2072
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2073 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2074
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2075 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2076 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2077
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2078
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2079 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2080
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2081 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2082 ngx_stream_proxy_set_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *pscf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2083 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2084 ngx_pool_cleanup_t *cln;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2085
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2086 pscf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2087 if (pscf->ssl == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2088 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2089 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2090
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2091 pscf->ssl->log = cf->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2092
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2093 if (ngx_ssl_create(pscf->ssl, pscf->ssl_protocols, NULL) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2094 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2095 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2096
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2097 cln = ngx_pool_cleanup_add(cf->pool, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2098 if (cln == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2099 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2100 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2101
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2102 cln->handler = ngx_ssl_cleanup_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2103 cln->data = pscf->ssl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2104
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2105 if (pscf->ssl_certificate.len) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2106
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2107 if (pscf->ssl_certificate_key.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2108 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2109 "no \"proxy_ssl_certificate_key\" is defined "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2110 "for certificate \"%V\"", &pscf->ssl_certificate);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2111 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2112 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2113
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2114 if (ngx_ssl_certificate(cf, pscf->ssl, &pscf->ssl_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2115 &pscf->ssl_certificate_key, pscf->ssl_passwords)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2116 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2117 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2118 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2119 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2120 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2121
6591
04d8d1f85649 SSL: ngx_ssl_ciphers() to set list of ciphers.
Tim Taubert <tim@timtaubert.de>
parents: 6530
diff changeset
2122 if (ngx_ssl_ciphers(cf, pscf->ssl, &pscf->ssl_ciphers, 0) != NGX_OK) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2123 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2124 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2125
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2126 if (pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2127 if (pscf->ssl_trusted_certificate.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2128 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2129 "no proxy_ssl_trusted_certificate for proxy_ssl_verify");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2130 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2131 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2132
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2133 if (ngx_ssl_trusted_certificate(cf, pscf->ssl,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2134 &pscf->ssl_trusted_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2135 pscf->ssl_verify_depth)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2136 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2137 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2138 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2139 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2140
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2141 if (ngx_ssl_crl(cf, pscf->ssl, &pscf->ssl_crl) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2142 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2143 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2144 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2145
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2146 if (ngx_ssl_client_session_cache(cf, pscf->ssl, pscf->ssl_session_reuse)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2147 != NGX_OK)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2148 {
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2149 return NGX_ERROR;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2150 }
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7286
diff changeset
2151
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2152 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2153 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2154
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2155 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2156
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2157
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2158 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2159 ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2160 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2161 ngx_stream_proxy_srv_conf_t *pscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2162
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2163 ngx_url_t u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2164 ngx_str_t *value, *url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2165 ngx_stream_complex_value_t cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2166 ngx_stream_core_srv_conf_t *cscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2167 ngx_stream_compile_complex_value_t ccv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2168
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2169 if (pscf->upstream || pscf->upstream_value) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2170 return "is duplicate";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2171 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2172
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2173 cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2174
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2175 cscf->handler = ngx_stream_proxy_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2176
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2177 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2178
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2179 url = &value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2180
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2181 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2182
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2183 ccv.cf = cf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2184 ccv.value = url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2185 ccv.complex_value = &cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2186
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2187 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2188 return NGX_CONF_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2189 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2190
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2191 if (cv.lengths) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2192 pscf->upstream_value = ngx_palloc(cf->pool,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2193 sizeof(ngx_stream_complex_value_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2194 if (pscf->upstream_value == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2195 return NGX_CONF_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2196 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2197
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2198 *pscf->upstream_value = cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2199
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2200 return NGX_CONF_OK;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2201 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2202
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2203 ngx_memzero(&u, sizeof(ngx_url_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2204
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2205 u.url = *url;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2206 u.no_resolve = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2207
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2208 pscf->upstream = ngx_stream_upstream_add(cf, &u, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2209 if (pscf->upstream == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2210 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2211 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2212
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2213 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2214 }
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2215
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2216
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2217 static char *
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2218 ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2219 {
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2220 ngx_stream_proxy_srv_conf_t *pscf = conf;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2221
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2222 ngx_int_t rc;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2223 ngx_str_t *value;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2224 ngx_stream_complex_value_t cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2225 ngx_stream_upstream_local_t *local;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2226 ngx_stream_compile_complex_value_t ccv;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2227
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2228 if (pscf->local != NGX_CONF_UNSET_PTR) {
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2229 return "is duplicate";
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2230 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2231
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2232 value = cf->args->elts;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2233
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2234 if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) {
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2235 pscf->local = NULL;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2236 return NGX_CONF_OK;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2237 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2238
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2239 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2240
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2241 ccv.cf = cf;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2242 ccv.value = &value[1];
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2243 ccv.complex_value = &cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2244
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2245 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2246 return NGX_CONF_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2247 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2248
6598
4a724d6006ee Stream: use ngx_pcalloc() in ngx_stream_proxy_bind().
Roman Arutyunyan <arut@nginx.com>
parents: 6595
diff changeset
2249 local = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_local_t));
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2250 if (local == NULL) {
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2251 return NGX_CONF_ERROR;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2252 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2253
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2254 pscf->local = local;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2255
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2256 if (cv.lengths) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2257 local->value = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t));
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2258 if (local->value == NULL) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2259 return NGX_CONF_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2260 }
6595
0c98c4092440 Stream: support for $remote_port in proxy_bind.
Roman Arutyunyan <arut@nginx.com>
parents: 6594
diff changeset
2261
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2262 *local->value = cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2263
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2264 } else {
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2265 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2266 if (local->addr == NULL) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2267 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2268 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2269
6594
3c87b82b17d4 Upstream: support for port in proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6593
diff changeset
2270 rc = ngx_parse_addr_port(cf->pool, local->addr, value[1].data,
3c87b82b17d4 Upstream: support for port in proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6593
diff changeset
2271 value[1].len);
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2272
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2273 switch (rc) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2274 case NGX_OK:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2275 local->addr->name = value[1];
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2276 break;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2277
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2278 case NGX_DECLINED:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2279 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2280 "invalid address \"%V\"", &value[1]);
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2281 /* fall through */
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2282
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2283 default:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2284 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2285 }
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2286 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2287
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2288 if (cf->args->nelts > 2) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2289 if (ngx_strcmp(value[2].data, "transparent") == 0) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2290 #if (NGX_HAVE_TRANSPARENT_PROXY)
7174
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2291 ngx_core_conf_t *ccf;
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2292
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2293 ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2294 ngx_core_module);
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2295
84e53e4735a4 Retain CAP_NET_RAW capability for transparent proxying.
Roman Arutyunyan <arut@nginx.com>
parents: 7156
diff changeset
2296 ccf->transparent = 1;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2297 local->transparent = 1;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2298 #else
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2299 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2300 "transparent proxying is not supported "
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2301 "on this platform, ignored");
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2302 #endif
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2303 } else {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2304 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2305 "invalid parameter \"%V\"", &value[2]);
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2306 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2307 }
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2308 }
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2309
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2310 return NGX_CONF_OK;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2311 }