#1060  Ngnix Reverse proxy env : Error serving request, should have either 'pageId'
Closed
Jiung opened 1 year ago

I am using Nginx Proxy Manager to connect domain with OneDev Server (7.8.15) But now I am facing very annoying error at every 30s below.

ERROR io.onedev.server.util.ExceptionUtils - Error serving request java.lang.IllegalArgumentException: The request should have either 'pageId' or 'resourceName' parameter! (at every 30s) at org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.(AbstractWebSocketProcessor.java:122) at io.onedev.server.web.websocket.WebSocketProcessor.(WebSocketProcessor.java:61) at io.onedev.server.web.websocket.WebSocketFilter$1.createWebSocket(WebSocketFilter.java:64) at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:230) at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:215) at io.onedev.server.web.websocket.WebSocketFilter.acceptWebSocket(WebSocketFilter.java:81) at org.apache.wicket.protocol.ws.AbstractUpgradeFilter.processRequestCycle(AbstractUpgradeFilter.java:66) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203) at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:137)

My environment is little bit different from official documentaion (A: Proxy Server, B: GIT server) I thought that problem would be Websocket issue, so trying to forward real IP by adding settings like below

     server_name xxx.yyy.com;
     
     # maximum size of uploaded file. Increase this if your repository is very large
     client_max_body_size 200M; 
     
proxy_hide_header X-Powered-By;
add_header Content-Security-Policy "upgrade-insecure-requests";
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Cache-Control "no-transform" always;
add_header Referrer-Policy no-referrer always;
add_header X-Robots-Tag none;

#Forwading websocket call 
location /wicket/websocket {
    try_files $uri @wss;
}

location @wss {
    proxy_pass http://serverIP:6610;
    proxy_http_version 1.1;
    
    # To forward realIP to GIT server instead of Proxy IP 
    proxy_set_header Host $server;
    proxy_set_header X-Forwarded-Scheme $scheme;
    proxy_set_header X-Forwarded-Proto  $scheme;
    proxy_set_header X-Forwarded-For    $remote_addr;
   
    proxy_read_timeout     60;
    proxy_connect_timeout  60;
    proxy_redirect         off;

 
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}



     location /~server {
             proxy_pass http://serverIP/~server;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
     }
     
     location / {
             proxy_pass http://$server:6610/;
     }

But it isnt working till now. Still got same error messages at every 30s. Could you help me to fix it too?

Reference Ngnix setting

https://docs.onedev.io/administration-guide/reverse-proxy-setup/

     listen 80;
     listen [::]:80;

     server_name onedev.example.com;
     
     # maximum size of uploaded file. Increase this if your repository is very large
     client_max_body_size 100M; 
     
     location /wicket/websocket {
             proxy_pass http://localhost:6610/wicket/websocket;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";                
     }

     location /~server {
             proxy_pass http://localhost:6610/~server;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
     }
     
     location / {
             proxy_pass http://localhost:6610/;
     }
}
Jiung changed fields 1 year ago
Name Previous Value Current Value
Type
Bug
Support Request
Robin Shen commented 1 year ago

I am not very familiar with Nginx. Does it has some log displaying which url it is connecting to OneDev every 30s?

Jiung commented 1 year ago

Yep, exactly same as I showed you before

2022-12-26 21:55:20,264 ERROR [qtp229791798-38] io.onedev.server.util.ExceptionUtils Error serving request java.lang.IllegalArgumentException: The request should have either 'pageId' or 'resourceName' parameter! at org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.(AbstractWebSocketProcessor.java:122) at io.onedev.server.web.websocket.WebSocketProcessor.(WebSocketProcessor.java:61) at io.onedev.server.web.websocket.WebSocketFilter$1.createWebSocket(WebSocketFilter.java:64) at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:230) at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:215) at io.onedev.server.web.websocket.WebSocketFilter.acceptWebSocket(WebSocketFilter.java:81) at org.apache.wicket.protocol.ws.AbstractUpgradeFilter.processRequestCycle(AbstractUpgradeFilter.java:66) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203) at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:137) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at io.onedev.server.web.DefaultWicketServlet.service(DefaultWicketServlet.java:43) at io.onedev.server.persistence.SessionInterceptor$1.call(SessionInterceptor.java:23) at io.onedev.server.persistence.DefaultSessionManager.call(DefaultSessionManager.java:90) at io.onedev.server.persistence.SessionInterceptor.invoke(SessionInterceptor.java:18) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626) at com.google.inject.servlet.DefaultFilterPipeline.dispatch(DefaultFilterPipeline.java:47) at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at io.onedev.server.git.GoGetFilter.doFilter(GoGetFilter.java:87) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at io.onedev.server.git.GitLfsFilter.doFilter(GitLfsFilter.java:511) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at io.onedev.server.git.GitFilter.doFilter(GitFilter.java:394) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at io.onedev.server.jetty.DisableTraceFilter.doFilter(DisableTraceFilter.java:28) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:763) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) at java.base/java.lang.Thread.run(Thread.java:833)

Robin Shen commented 1 year ago

I mean does Nginx has somewhere to check what is the exact url it is using to connect to OneDev? I want to check that url for sure.

Robin Shen commented 1 year ago

For websocket url, there is also some query string appended at my side, for instance:

/wicket/websocket?pageId=3&wicket-ajax-baseurl=&wicket-app-name=DefaultWicketServlet%24%24EnhancerByGuice%24%24160010585

So please make sure your nginx rule forward query string part as well.

Jiung commented 1 year ago

Yep. Here is svr URL

Robin Shen commented 1 year ago

This info does not help. Please check/enable nginx log and check what url it is using when connect to OneDev backend

Robin Shen commented 1 year ago

I guess some query string is trimmed by your Nginx rule

Jiung commented 1 year ago

Okay, I will investigate it.

Jiung commented 1 year ago

There aren't so many error logs that I was expected

Access log [26/Dec/2022:13:17:27 +0000] - 500 500 - GET http gitb.madorca.com "/server" [Client 110.234.32.229] [Length 646] [Gzip -] [Sent-to 192.168.0.109] "Jetty/9.4.43.v20210629" "-" 2022-12-26 22:17:27,439 ERROR [qtp229791798-38] io.onedev.server.util.ExceptionUtils Error serving request java.lang.IllegalArgumentException: The request should have either 'pageId' or 'resourceName' parameter!

[26/Dec/2022:13:17:42 +0000] - 500 500 - GET http gitb.madorca.com "/server" [Client 211.58.154.16] [Length 646] [Gzip -] [Sent-to 192.168.0.109] "Jetty/9.4.43.v20210629" "-" 2022-12-26 22:17:42,977 ERROR [qtp229791798-38] io.onedev.server.util.ExceptionUtils Error serving request java.lang.IllegalArgumentException: The request should have either 'pageId' or 'resourceName' parameter!

I don't know why Jetty keep requests, but if Jetty sent then those network error would happen considering its error loging time. Jetty is requesting every 30s, so it would be cause of this issue.

But cant find its exact parameter.. Hm For the error log of ngninx, can't find relevant things except several error messages which would not be related considering its querying time.

2022/12/26 11:09:32 [error] 2880#2880: *3312002 connect() failed (111: Connection refused) while connecting to upstream, client: 211.58.154.16, server: gitb.madorca.com, request: "GET /server HTTP/1.1", upstream: "http://192.168.0.109:6610/server", host: "gitb.madorca.com:80"

Robin Shen commented 1 year ago

So why there is stillhttp://192.168.0.109:6610/server? It should be http://192.168.0.109:6610/~server instead.

Robin Shen commented 1 year ago

I guess some of your agent is not upgraded yet.

Jiung commented 1 year ago

Ah okay, I will check agent setting. And will check ~server too.

Jiung commented 1 year ago

Error message is finally stopped.

  1. redirect every /server request to /~server

  2. delete line below from custom code

    location / { proxy_pass http://$server:6610/; }

  3. removing every agents added

Greatly Appreciated.

Robin Shen changed state to 'Closed' 1 year ago
Previous Value Current Value
Open
Closed
issue 1 of 1
Type
Question
Priority
Normal
Assignee
Issue Votes (0)
Watchers (4)
Reference
onedev/server#1060
Please wait...
Page is in error, reload to recover