PageRenderTime 56ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/t/068-socket-keepalive.t

https://github.com/npk/lua-nginx-module
Unknown | 964 lines | 764 code | 200 blank | 0 comment | 0 complexity | 8c53743746bc145b4b5088ee437fda2b MD5 | raw file
  1. # vim:set ft= ts=4 sw=4 et fdm=marker:
  2. use lib 'lib';
  3. use Test::Nginx::Socket;
  4. repeat_each(2);
  5. plan tests => repeat_each() * (blocks() * 5 + 8);
  6. our $HtmlDir = html_dir;
  7. $ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();
  8. $ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
  9. $ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;
  10. #$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;
  11. $ENV{LUA_PATH} ||=
  12. '/usr/local/openresty-debug/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;';
  13. no_long_string();
  14. #no_diff();
  15. #log_level 'warn';
  16. no_shuffle();
  17. run_tests();
  18. __DATA__
  19. === TEST 1: sanity
  20. --- http_config eval
  21. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  22. --- config
  23. location /t {
  24. set $port $TEST_NGINX_MEMCACHED_PORT;
  25. content_by_lua '
  26. local test = require "test"
  27. local port = ngx.var.port
  28. test.go(port)
  29. test.go(port)
  30. ';
  31. }
  32. --- user_files
  33. >>> test.lua
  34. module("test", package.seeall)
  35. function go(port)
  36. local sock = ngx.socket.tcp()
  37. local ok, err = sock:connect("127.0.0.1", port)
  38. if not ok then
  39. ngx.say("failed to connect: ", err)
  40. return
  41. end
  42. ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())
  43. local req = "flush_all\r\n"
  44. local bytes, err = sock:send(req)
  45. if not bytes then
  46. ngx.say("failed to send request: ", err)
  47. return
  48. end
  49. ngx.say("request sent: ", bytes)
  50. local line, err, part = sock:receive()
  51. if line then
  52. ngx.say("received: ", line)
  53. else
  54. ngx.say("failed to receive a line: ", err, " [", part, "]")
  55. end
  56. local ok, err = sock:setkeepalive()
  57. if not ok then
  58. ngx.say("failed to set reusable: ", err)
  59. end
  60. end
  61. --- request
  62. GET /t
  63. --- response_body_like
  64. ^connected: 1, reused: \d+
  65. request sent: 11
  66. received: OK
  67. connected: 1, reused: [1-9]\d*
  68. request sent: 11
  69. received: OK
  70. --- no_error_log eval
  71. ["[error]",
  72. "lua socket keepalive: free connection pool for "]
  73. --- error_log eval
  74. qq{lua socket get keepalive peer: using connection
  75. lua socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"
  76. }
  77. === TEST 2: free up the whole connection pool if no active connections
  78. --- http_config eval
  79. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  80. --- config
  81. location /t {
  82. set $port $TEST_NGINX_MEMCACHED_PORT;
  83. content_by_lua '
  84. local test = require "test"
  85. local port = ngx.var.port
  86. test.go(port, true)
  87. test.go(port, false)
  88. ';
  89. }
  90. --- request
  91. GET /t
  92. --- user_files
  93. >>> test.lua
  94. module("test", package.seeall)
  95. function go(port, keepalive)
  96. local sock = ngx.socket.tcp()
  97. local ok, err = sock:connect("127.0.0.1", port)
  98. if not ok then
  99. ngx.say("failed to connect: ", err)
  100. return
  101. end
  102. ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())
  103. local req = "flush_all\r\n"
  104. local bytes, err = sock:send(req)
  105. if not bytes then
  106. ngx.say("failed to send request: ", err)
  107. return
  108. end
  109. ngx.say("request sent: ", bytes)
  110. local line, err, part = sock:receive()
  111. if line then
  112. ngx.say("received: ", line)
  113. else
  114. ngx.say("failed to receive a line: ", err, " [", part, "]")
  115. end
  116. if keepalive then
  117. local ok, err = sock:setkeepalive()
  118. if not ok then
  119. ngx.say("failed to set reusable: ", err)
  120. end
  121. else
  122. sock:close()
  123. end
  124. end
  125. --- response_body_like
  126. ^connected: 1, reused: \d+
  127. request sent: 11
  128. received: OK
  129. connected: 1, reused: [1-9]\d*
  130. request sent: 11
  131. received: OK
  132. --- no_error_log
  133. [error]
  134. --- error_log eval
  135. ["lua socket get keepalive peer: using connection",
  136. "lua socket keepalive: free connection pool for "]
  137. === TEST 3: upstream sockets close prematurely
  138. --- http_config eval
  139. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  140. --- config
  141. server_tokens off;
  142. keepalive_timeout 100ms;
  143. location /t {
  144. set $port $TEST_NGINX_CLIENT_PORT;
  145. content_by_lua '
  146. local port = ngx.var.port
  147. local sock = ngx.socket.tcp()
  148. local ok, err = sock:connect("127.0.0.1", port)
  149. if not ok then
  150. ngx.say("failed to connect: ", err)
  151. return
  152. end
  153. ngx.say("connected: ", ok)
  154. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  155. local bytes, err = sock:send(req)
  156. if not bytes then
  157. ngx.say("failed to send request: ", err)
  158. return
  159. end
  160. ngx.say("request sent: ", bytes)
  161. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  162. local data, err = reader()
  163. if not data then
  164. ngx.say("failed to receive response body: ", err)
  165. return
  166. end
  167. ngx.say("received response of ", #data, " bytes")
  168. local ok, err = sock:setkeepalive()
  169. if not ok then
  170. ngx.say("failed to set reusable: ", err)
  171. end
  172. ngx.location.capture("/sleep")
  173. ngx.say("done")
  174. ';
  175. }
  176. location /foo {
  177. echo foo;
  178. }
  179. location /sleep {
  180. echo_sleep 1;
  181. }
  182. --- request
  183. GET /t
  184. --- response_body
  185. connected: 1
  186. request sent: 61
  187. received response of 156 bytes
  188. done
  189. --- no_error_log
  190. [error]
  191. --- error_log eval
  192. ["lua socket keepalive close handler",
  193. "lua socket keepalive: free connection pool for "]
  194. --- timeout: 3
  195. === TEST 4: http keepalive
  196. --- http_config eval
  197. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  198. --- config
  199. server_tokens off;
  200. location /t {
  201. keepalive_timeout 60s;
  202. set $port $TEST_NGINX_CLIENT_PORT;
  203. content_by_lua '
  204. local port = ngx.var.port
  205. local sock = ngx.socket.tcp()
  206. local ok, err = sock:connect("127.0.0.1", port)
  207. if not ok then
  208. ngx.say("failed to connect: ", err)
  209. return
  210. end
  211. ngx.say("connected: ", ok)
  212. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  213. local bytes, err = sock:send(req)
  214. if not bytes then
  215. ngx.say("failed to send request: ", err)
  216. return
  217. end
  218. ngx.say("request sent: ", bytes)
  219. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  220. local data, err = reader()
  221. if not data then
  222. ngx.say("failed to receive response body: ", err)
  223. return
  224. end
  225. ngx.say("received response of ", #data, " bytes")
  226. local ok, err = sock:setkeepalive()
  227. if not ok then
  228. ngx.say("failed to set reusable: ", err)
  229. end
  230. ngx.location.capture("/sleep")
  231. ngx.say("done")
  232. ';
  233. }
  234. location /foo {
  235. echo foo;
  236. }
  237. location /sleep {
  238. echo_sleep 1;
  239. }
  240. --- request
  241. GET /t
  242. --- response_body
  243. connected: 1
  244. request sent: 61
  245. received response of 156 bytes
  246. done
  247. --- no_error_log eval
  248. ["[error]",
  249. "lua socket keepalive close handler: fd:",
  250. "lua socket keepalive: free connection pool for "]
  251. --- timeout: 4
  252. === TEST 5: lua_socket_keepalive_timeout
  253. --- config
  254. server_tokens off;
  255. location /t {
  256. keepalive_timeout 60s;
  257. lua_socket_keepalive_timeout 100ms;
  258. set $port $TEST_NGINX_CLIENT_PORT;
  259. content_by_lua '
  260. local port = ngx.var.port
  261. local sock = ngx.socket.tcp()
  262. local ok, err = sock:connect("127.0.0.1", port)
  263. if not ok then
  264. ngx.say("failed to connect: ", err)
  265. return
  266. end
  267. ngx.say("connected: ", ok)
  268. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  269. local bytes, err = sock:send(req)
  270. if not bytes then
  271. ngx.say("failed to send request: ", err)
  272. return
  273. end
  274. ngx.say("request sent: ", bytes)
  275. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  276. local data, res = reader()
  277. if not data then
  278. ngx.say("failed to receive response body: ", err)
  279. return
  280. end
  281. ngx.say("received response of ", #data, " bytes")
  282. local ok, err = sock:setkeepalive()
  283. if not ok then
  284. ngx.say("failed to set reusable: ", err)
  285. end
  286. ngx.location.capture("/sleep")
  287. ngx.say("done")
  288. ';
  289. }
  290. location /foo {
  291. echo foo;
  292. }
  293. location /sleep {
  294. echo_sleep 1;
  295. }
  296. --- request
  297. GET /t
  298. --- response_body
  299. connected: 1
  300. request sent: 61
  301. received response of 156 bytes
  302. done
  303. --- no_error_log
  304. [error]
  305. --- error_log eval
  306. ["lua socket keepalive close handler",
  307. "lua socket keepalive: free connection pool for ",
  308. "lua socket keepalive timeout: 100 ms",
  309. qr/lua socket connection pool size: 30\b/]
  310. --- timeout: 4
  311. === TEST 6: lua_socket_pool_size
  312. --- config
  313. server_tokens off;
  314. location /t {
  315. keepalive_timeout 60s;
  316. lua_socket_keepalive_timeout 100ms;
  317. lua_socket_pool_size 1;
  318. set $port $TEST_NGINX_CLIENT_PORT;
  319. content_by_lua '
  320. local port = ngx.var.port
  321. local sock = ngx.socket.tcp()
  322. local ok, err = sock:connect("127.0.0.1", port)
  323. if not ok then
  324. ngx.say("failed to connect: ", err)
  325. return
  326. end
  327. ngx.say("connected: ", ok)
  328. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  329. local bytes, err = sock:send(req)
  330. if not bytes then
  331. ngx.say("failed to send request: ", err)
  332. return
  333. end
  334. ngx.say("request sent: ", bytes)
  335. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  336. local data, res = reader()
  337. if not data then
  338. ngx.say("failed to receive response body: ", err)
  339. return
  340. end
  341. ngx.say("received response of ", #data, " bytes")
  342. local ok, err = sock:setkeepalive()
  343. if not ok then
  344. ngx.say("failed to set reusable: ", err)
  345. end
  346. ngx.location.capture("/sleep")
  347. ngx.say("done")
  348. ';
  349. }
  350. location /foo {
  351. echo foo;
  352. }
  353. location /sleep {
  354. echo_sleep 1;
  355. }
  356. --- request
  357. GET /t
  358. --- response_body
  359. connected: 1
  360. request sent: 61
  361. received response of 156 bytes
  362. done
  363. --- no_error_log
  364. [error]
  365. --- error_log eval
  366. ["lua socket keepalive close handler",
  367. "lua socket keepalive: free connection pool for ",
  368. "lua socket keepalive timeout: 100 ms",
  369. qr/lua socket connection pool size: 1\b/]
  370. --- timeout: 4
  371. === TEST 7: "lua_socket_keepalive_timeout 0" means unlimited
  372. --- config
  373. server_tokens off;
  374. location /t {
  375. keepalive_timeout 60s;
  376. lua_socket_keepalive_timeout 0;
  377. set $port $TEST_NGINX_CLIENT_PORT;
  378. content_by_lua '
  379. local port = ngx.var.port
  380. local sock = ngx.socket.tcp()
  381. local ok, err = sock:connect("127.0.0.1", port)
  382. if not ok then
  383. ngx.say("failed to connect: ", err)
  384. return
  385. end
  386. ngx.say("connected: ", ok)
  387. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  388. local bytes, err = sock:send(req)
  389. if not bytes then
  390. ngx.say("failed to send request: ", err)
  391. return
  392. end
  393. ngx.say("request sent: ", bytes)
  394. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  395. local data, res = reader()
  396. if not data then
  397. ngx.say("failed to receive response body: ", err)
  398. return
  399. end
  400. ngx.say("received response of ", #data, " bytes")
  401. local ok, err = sock:setkeepalive()
  402. if not ok then
  403. ngx.say("failed to set reusable: ", err)
  404. end
  405. ngx.location.capture("/sleep")
  406. ngx.say("done")
  407. ';
  408. }
  409. location /foo {
  410. echo foo;
  411. }
  412. location /sleep {
  413. echo_sleep 1;
  414. }
  415. --- request
  416. GET /t
  417. --- response_body
  418. connected: 1
  419. request sent: 61
  420. received response of 156 bytes
  421. done
  422. --- no_error_log
  423. [error]
  424. --- error_log eval
  425. ["lua socket keepalive timeout: unlimited",
  426. qr/lua socket connection pool size: 30\b/]
  427. --- timeout: 4
  428. === TEST 8: setkeepalive(timeout) overrides lua_socket_keepalive_timeout
  429. --- config
  430. server_tokens off;
  431. location /t {
  432. keepalive_timeout 60s;
  433. lua_socket_keepalive_timeout 60s;
  434. set $port $TEST_NGINX_CLIENT_PORT;
  435. content_by_lua '
  436. local port = ngx.var.port
  437. local sock = ngx.socket.tcp()
  438. local ok, err = sock:connect("127.0.0.1", port)
  439. if not ok then
  440. ngx.say("failed to connect: ", err)
  441. return
  442. end
  443. ngx.say("connected: ", ok)
  444. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  445. local bytes, err = sock:send(req)
  446. if not bytes then
  447. ngx.say("failed to send request: ", err)
  448. return
  449. end
  450. ngx.say("request sent: ", bytes)
  451. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  452. local data, res = reader()
  453. if not data then
  454. ngx.say("failed to receive response body: ", err)
  455. return
  456. end
  457. ngx.say("received response of ", #data, " bytes")
  458. local ok, err = sock:setkeepalive(123)
  459. if not ok then
  460. ngx.say("failed to set reusable: ", err)
  461. end
  462. ngx.location.capture("/sleep")
  463. ngx.say("done")
  464. ';
  465. }
  466. location /foo {
  467. echo foo;
  468. }
  469. location /sleep {
  470. echo_sleep 1;
  471. }
  472. --- request
  473. GET /t
  474. --- response_body
  475. connected: 1
  476. request sent: 61
  477. received response of 156 bytes
  478. done
  479. --- no_error_log
  480. [error]
  481. --- error_log eval
  482. ["lua socket keepalive close handler",
  483. "lua socket keepalive: free connection pool for ",
  484. "lua socket keepalive timeout: 123 ms",
  485. qr/lua socket connection pool size: 30\b/]
  486. --- timeout: 4
  487. === TEST 9: sock:setkeepalive(timeout, size) overrides lua_socket_pool_size
  488. --- config
  489. server_tokens off;
  490. location /t {
  491. keepalive_timeout 60s;
  492. lua_socket_keepalive_timeout 100ms;
  493. lua_socket_pool_size 100;
  494. set $port $TEST_NGINX_CLIENT_PORT;
  495. content_by_lua '
  496. local port = ngx.var.port
  497. local sock = ngx.socket.tcp()
  498. local ok, err = sock:connect("127.0.0.1", port)
  499. if not ok then
  500. ngx.say("failed to connect: ", err)
  501. return
  502. end
  503. ngx.say("connected: ", ok)
  504. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  505. local bytes, err = sock:send(req)
  506. if not bytes then
  507. ngx.say("failed to send request: ", err)
  508. return
  509. end
  510. ngx.say("request sent: ", bytes)
  511. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  512. local data, res = reader()
  513. if not data then
  514. ngx.say("failed to receive response body: ", err)
  515. return
  516. end
  517. ngx.say("received response of ", #data, " bytes")
  518. local ok, err = sock:setkeepalive(101, 25)
  519. if not ok then
  520. ngx.say("failed to set reusable: ", err)
  521. end
  522. ngx.location.capture("/sleep")
  523. ngx.say("done")
  524. ';
  525. }
  526. location /foo {
  527. echo foo;
  528. }
  529. location /sleep {
  530. echo_sleep 1;
  531. }
  532. --- request
  533. GET /t
  534. --- response_body
  535. connected: 1
  536. request sent: 61
  537. received response of 156 bytes
  538. done
  539. --- no_error_log
  540. [error]
  541. --- error_log eval
  542. ["lua socket keepalive close handler",
  543. "lua socket keepalive: free connection pool for ",
  544. "lua socket keepalive timeout: 101 ms",
  545. qr/lua socket connection pool size: 25\b/]
  546. --- timeout: 4
  547. === TEST 10: sock:keepalive_timeout(0) means unlimited
  548. --- config
  549. server_tokens off;
  550. location /t {
  551. keepalive_timeout 60s;
  552. lua_socket_keepalive_timeout 1000ms;
  553. set $port $TEST_NGINX_CLIENT_PORT;
  554. content_by_lua '
  555. local port = ngx.var.port
  556. local sock = ngx.socket.tcp()
  557. local ok, err = sock:connect("127.0.0.1", port)
  558. if not ok then
  559. ngx.say("failed to connect: ", err)
  560. return
  561. end
  562. ngx.say("connected: ", ok)
  563. local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"
  564. local bytes, err = sock:send(req)
  565. if not bytes then
  566. ngx.say("failed to send request: ", err)
  567. return
  568. end
  569. ngx.say("request sent: ", bytes)
  570. local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")
  571. local data, res = reader()
  572. if not data then
  573. ngx.say("failed to receive response body: ", err)
  574. return
  575. end
  576. ngx.say("received response of ", #data, " bytes")
  577. local ok, err = sock:setkeepalive(0)
  578. if not ok then
  579. ngx.say("failed to set reusable: ", err)
  580. end
  581. ngx.location.capture("/sleep")
  582. ngx.say("done")
  583. ';
  584. }
  585. location /foo {
  586. echo foo;
  587. }
  588. location /sleep {
  589. echo_sleep 1;
  590. }
  591. --- request
  592. GET /t
  593. --- response_body
  594. connected: 1
  595. request sent: 61
  596. received response of 156 bytes
  597. done
  598. --- no_error_log
  599. [error]
  600. --- error_log eval
  601. ["lua socket keepalive timeout: unlimited",
  602. qr/lua socket connection pool size: 30\b/]
  603. --- timeout: 4
  604. === TEST 11: sanity (uds)
  605. --- http_config eval
  606. "
  607. lua_package_path '$::HtmlDir/?.lua;./?.lua';
  608. server {
  609. listen unix:$::HtmlDir/nginx.sock;
  610. default_type 'text/plain';
  611. server_tokens off;
  612. location /foo {
  613. echo foo;
  614. more_clear_headers Date;
  615. }
  616. }
  617. "
  618. --- config
  619. location /t {
  620. set $port $TEST_NGINX_MEMCACHED_PORT;
  621. content_by_lua '
  622. local test = require "test"
  623. local path = "$TEST_NGINX_HTML_DIR/nginx.sock";
  624. local port = ngx.var.port
  625. test.go(path, port)
  626. test.go(path, port)
  627. ';
  628. }
  629. --- request
  630. GET /t
  631. --- user_files
  632. >>> test.lua
  633. module("test", package.seeall)
  634. function go(path, port)
  635. local sock = ngx.socket.tcp()
  636. local ok, err = sock:connect("unix:" .. path)
  637. if not ok then
  638. ngx.say("failed to connect: ", err)
  639. return
  640. end
  641. ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())
  642. local req = "GET /foo HTTP/1.1\r\nHost: localhost\r\nConnection: keepalive\r\n\r\n"
  643. local bytes, err = sock:send(req)
  644. if not bytes then
  645. ngx.say("failed to send request: ", err)
  646. return
  647. end
  648. ngx.say("request sent: ", bytes)
  649. local reader = sock:receiveuntil("\r\n0\r\n\r\n")
  650. local data, err = reader()
  651. if not data then
  652. ngx.say("failed to receive response body: ", err)
  653. return
  654. end
  655. ngx.say("received response of ", #data, " bytes")
  656. local ok, err = sock:setkeepalive()
  657. if not ok then
  658. ngx.say("failed to set reusable: ", err)
  659. end
  660. end
  661. --- response_body_like
  662. ^connected: 1, reused: \d+
  663. request sent: 61
  664. received response of 119 bytes
  665. connected: 1, reused: [1-9]\d*
  666. request sent: 61
  667. received response of 119 bytes
  668. --- no_error_log eval
  669. ["[error]",
  670. "lua socket keepalive: free connection pool for "]
  671. --- error_log eval
  672. ["lua socket get keepalive peer: using connection",
  673. 'lua socket keepalive create connection pool for key "unix:']
  674. === TEST 12: github issue #108: ngx.locaiton.capture + redis.set_keepalive
  675. --- http_config eval
  676. qq{
  677. lua_package_path "$::HtmlDir/?.lua;;";
  678. }
  679. --- config
  680. location /t {
  681. default_type text/html;
  682. set $port $TEST_NGINX_MEMCACHED_PORT;
  683. #lua_code_cache off;
  684. lua_need_request_body on;
  685. content_by_lua_file html/t.lua;
  686. }
  687. location /anyurl {
  688. internal;
  689. proxy_pass http://127.0.0.1:$server_port/dummy;
  690. }
  691. location = /dummy {
  692. echo dummy;
  693. }
  694. --- user_files
  695. >>> t.lua
  696. local sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)
  697. if not sock then ngx.say(err) return end
  698. sock:send("flush_all\r\n")
  699. sock:receive()
  700. sock:setkeepalive()
  701. sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)
  702. if not sock then ngx.say(err) return end
  703. local res = ngx.location.capture("/anyurl") --3
  704. ngx.say("ok")
  705. --- request
  706. GET /t
  707. --- response_body
  708. ok
  709. --- error_log
  710. lua socket get keepalive peer: using connection
  711. --- no_error_log
  712. [error]
  713. [alert]
  714. === TEST 13: github issue #110: ngx.exit with HTTP_NOT_FOUND causes worker process to exit
  715. --- http_config eval
  716. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  717. --- config
  718. error_page 404 /404.html;
  719. location /t {
  720. set $port $TEST_NGINX_MEMCACHED_PORT;
  721. access_by_lua '
  722. local test = require "test"
  723. local port = ngx.var.port
  724. test.go(port)
  725. ngx.exit(404)
  726. ';
  727. echo hello;
  728. }
  729. --- user_files
  730. >>> 404.html
  731. Not found, dear...
  732. >>> test.lua
  733. module("test", package.seeall)
  734. function go(port)
  735. local sock = ngx.socket.tcp()
  736. local ok, err = sock:connect("127.0.0.1", port)
  737. if not ok then
  738. ngx.log(ngx.ERR, "failed to connect: ", err)
  739. return
  740. end
  741. local req = "flush_all\r\n"
  742. local bytes, err = sock:send(req)
  743. if not bytes then
  744. ngx.log(ngx.ERR, "failed to send request: ", err)
  745. return
  746. end
  747. local line, err, part = sock:receive()
  748. if not line then
  749. ngx.log(ngx.ERR, "failed to receive a line: ", err, " [", part, "]")
  750. return
  751. end
  752. -- local ok, err = sock:setkeepalive()
  753. -- if not ok then
  754. -- ngx.log(ngx.ERR, "failed to set reusable: ", err)
  755. -- return
  756. -- end
  757. end
  758. --- request
  759. GET /t
  760. --- response_body
  761. Not found, dear...
  762. --- error_code: 404
  763. --- no_error_log
  764. [error]