On Github donatasm / hacking-an-nginx-module
start_new_master() { echo -n $"Starting new master $prog: " killproc -p $PIDFILE $prog -USR2 } kill_old_master() { echo -n $"Killing old master $prog: " old_pid_file="$pid_location/running.pid.oldbin" killproc -p $old_pid_file $prog -QUIT } upgrade() { start_new_master sleep 1 kill_old_master }
worker_processes 16; working_directory /usr/local/bidder-http/logs/; http { error_log /usr/local/bidder-http/logs/error.log warn; log_not_found off; server { listen *:80; location /bidder/bids { bidder name handler=openrtb timeout=80 bidders; } } upstream bidders { bidder_req_limit; server 11.12.13.14:8080 weight=4 max_fails=0 max_conns=6 req_limit=128; } }
it should "return empty bid response " + "when request contains requestId field" in withNginxBidder { bidder => val requestId = random.nextLong() val response = bidder.client .send(createBidRequest(requestId)) response should equal (emptyBidResponse(requestId)) }
it should "send request to the bidder" in withNginxBidder { bidder => val bidRequestBody = Array[Byte](1, 2, 3, 4, 5) val bidRequest = createBidRequest(bidRequestBody) bidder.server.respondWith(EmptyBidResponse) val bidResponse = bidder.client.send(bidRequest) bidResponse should equal(EmptyBidResponse) bidder.server.requests should contain (bidRequest) } it should "return 413 for huge request body" in withNginxBidder { bidder => val bidRequestBody = (for (i <- 1 to 10000000) yield 1.toByte).toArray val bidRequest = createBidRequest(bidRequestBody) val bidResponse = bidder.client.send(bidRequest) bidResponse should equal (HttpResponse(413, HttpEntity.Empty, List(`Content-Length`(0), `Connection`("close")))) }
def withNginxBidder(testCode: Bidder => Any): Unit = { var nginx: Nginx = null var bidder: Bidder = null implicit val system = ActorSystem("bidder-http", akkaConfig) try { nginx = Nginx() nginx.errors should not include "[emerg]" nginx.errors should not include "[error]" bidder = new Bidder nginx.spinUntilStarted(100) testCode(bidder) } finally { system.shutdown() system.awaitTermination() if (nginx != null) { Try(nginx.destroy()) assert(nginx.exitCode != Signal.SIGSEGV, "nginx process exited with segmentation fault") } } }
#!/bin/sh wrk -c4096 -t16 -d1h \ --latency --script request.lua \ http://1.2.3.4:7070/bids
./configure --with-debug gdb /path/to/nginx core.dump backtrace full ngx_log_debug0(NGX_LOG_DEBUG_HTTP, request->connection->log, 0, "THIS IS DEBUG MESSAGE");