У меня есть типичная установка для создания докеров, в которой мой Java AS (Payara) находится за веб-сервером (nginx), который реализует обратный прокси-сервер через директиву proxy_pass для перенаправления всех запросов сервера приложений на внутренний сокет сервера ip: port Payara. Мой docker-compose.yml
предоставляет только контейнер nginx со следующими докер nginx конфигурация сайта:
server {
listen 8080 default_server;
listen 8181 ssl default_server;
ssl_certificate /etc/nginx/server.pem;
ssl_certificate_key /etc/nginx/server.key;
root /app;
index index.html
server_name _;
location /app {
try_files $uri $uri/ /index.html;
}
location / {
proxy_pass http://payaradocker:8080;
}
}
Все работает нормально но я получаю значительное снижение производительности, примерно на 20%, при работе за nginx. Я думаю, это связано с тем, что на этом сервере приложений включен единый вход (я не могу пока просто отключить его), и одна из его функций - проверка области контекста запроса на каждом PwcCoyoteRequest запрос. Каким-то образом контекст теряется, когда впереди находится nginx, и я получаю следующий всплеск NPE, который в любом случае восстанавливает, обслуживая запрос, но оставляет следующую неприятную трассировку стека в моем журнале ошибок AS:
[#|2020-03-16T11:24:02.237+0000|SEVERE|Payara 5.194|javax.enterprise.web.core|_ThreadID=48;_ThreadName=http-thread-pool::http-listener-1(5);_TimeMillis=1584357842237;_LevelValue=1000;_MessageID=AS-WEB-CORE-00037;|
An exception or error occurred in the container during the request processing
java.lang.NullPointerException
at com.sun.enterprise.security.web.GlassFishSingleSignOn.invoke(GlassFishSingleSignOn.java:327)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:724)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:575)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:368)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:520)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:217)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:182)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:156)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:218)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:95)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:260)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:177)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:109)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:88)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:53)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:524)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:89)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:94)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:33)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:114)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:569)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:549)
at java.lang.Thread.run(Thread.java:748)
|#]
Вещи, которые я пробовал:
Я мог бы попробовать, но не очень хочу, если мне не нужно:
Что мне действительно нужно, так это
Любые идеи?