我使用nginx-clojure-0.4.5为Ubuntu 16.04构建nginx-1.13.1。
我使用了来自nginx-clojure站点的示例java代码(见下文),但在响应之前插入了1秒的睡眠。然后我启动了10个curl http调用来调用我的java代码。我预计10秒后所有10个curl http调用会同时或多或少地返回。但是,然后以1秒的间隔一次返回一个。这意味着nginx和/或nginx-clojure不是同时处理它们,而是串行处理它们。应该这样做吗?这是控制台输出:
ubuntu:/share/java$ ./launchControllers.sh 10
Fri 28 Jul 15:27:21 BST 2017
curl http://localhost:80/myJava/1 &
curl http://localhost:80/myJava/2 &
curl http://localhost:80/myJava/3 &
curl http://localhost:80/myJava/4 &
curl http://localhost:80/myJava/5 &
curl http://localhost:80/myJava/6 &
curl http://localhost:80/myJava/7 &
curl http://localhost:80/myJava/8 &
curl http://localhost:80/myJava/9 &
curl http://localhost:80/myJava/10 &
Fri 28 Jul 15:27:21 BST 2017
ubuntu:/share/java$
2017-07-28 15:27:23: Hello, Java & NGINX!
2017-07-28 15:27:24: Hello, Java & NGINX!
2017-07-28 15:27:25: Hello, Java & NGINX!
2017-07-28 15:27:26: Hello, Java & NGINX!
2017-07-28 15:27:27: Hello, Java & NGINX!
2017-07-28 15:27:28: Hello, Java & NGINX!
2017-07-28 15:27:29: Hello, Java & NGINX!
2017-07-28 15:27:30: Hello, Java & NGINX!
2017-07-28 15:27:31: Hello, Java & NGINX!
2017-07-28 15:27:32: Hello, Java & NGINX!
这是我的nginx-clojure java调用方法:
public Object[] invoke( Map<String, Object> request ) {
try {
Thread.sleep( 1000 );
}
catch ( Throwable t ) {
t.printStackTrace( System.err );
}
return new Object[] {
NGX_HTTP_OK, //http status 200
ArrayMap.create( CONTENT_TYPE, "text/plain" ), //headers map
new SimpleDateFormat( TS_FORMAT ).format( new Date() ) + ": " +
"Hello, Java & NGINX!\n" //response body can be string, File or Array/Collection of them
};
}
我还尝试将sleep替换为等待udp数据包并产生100个curl http调用的upd套接字(每个udp套接字监听唯一的端口号)。由此产生的行为非常奇怪。即使我向每个udp端口发送了一个数据包,http调用也会挂起,我必须单独终止curl调用。为什么nginx / nginx-closure表现得像这样?
答案 0 :(得分:0)
尝试nginx-clojure线程池模式,例如
jvm_workers 40;
或者使用多个Nginx工作进程,例如
worker_processes 8;
可以从https://nginx-clojure.github.io/more.html#311-more-about-nginx-worker-process
找到更多说明