ParaviewWeb use Apache on Win10

Hello,everyone!
I used the ParaView-5.9 binaries to get the ParaViewWeb implementation, and I successfully customized some implementations according to the simple configuration document.
http://kitware.github.io/paraviewweb/docs/architecture.html
I mainly refer to tsgouros’ implementation, and made some modifications:
https://github.com/tsgouros/ParaViewWeb-SimpleDemo
Here is the simple client window I created:

Yes, I didn’t use Visualizer directly.
I encountered some errors when trying to use Apache Web Server on Win10 from documentation:
http://kitware.github.io/paraviewweb/docs/windows_10.html
When I’m configured as described in the documentation and start laucher.bat, under the http://localhost:9000/paraview won the Processing Failed error:
WGZK)_3BSYC8@}}I3(IWY
The following error message appears in launcherlog.log:

Traceback (most recent call last):
File “D:\paraview-remote-rendering-web\bin\Lib\site-packages\twisted\web\server.py”, line 217, in process
self.render(resrc)
File “D:\paraview-remote-rendering-web\bin\Lib\site-packages\twisted\web\server.py”, line 284, in render
body = resrc.render(self)
File “D:\paraview-remote-rendering-web\bin\Lib\site-packages\twisted\web\resource.py”, line 265, in render
return m(request)
File “D:\paraview-remote-rendering-web\bin\Lib\site-packages\wslink\launcher.py”, line 607, in render_GET
id = extractSessionId(request)
File “D:\paraview-remote-rendering-web\bin\Lib\site-packages\wslink\launcher.py”, line 252, in extractSessionId
path = request.path.split(‘/’)
TypeError: a bytes-like object is required, not ‘str’

My httpd-vhosts.conf configuration is as follows:

<VirtualHost *:80>
  ServerName   paraview
  ServerAdmin  admin@paraview.com
  DocumentRoot D:/paraview-remote-rendering-web/share/paraview-5.9/web/ParaViewWeb-SimpleDemo-master/js/www
  ErrorLog D:/paraview-remote-rendering-web/error.log
  CustomLog  D:/paraview-remote-rendering-web/log/apache2/access.log combined
  <Directory "D:/paraview-remote-rendering-web">
      Options Indexes FollowSymLinks
      Order allow,deny
      Allow from all
      AllowOverride None
      Require all granted
  </Directory>

  # Handle launcher forwarding
  # port and endpoint should match launcher.config
  ProxyPass /paraview http://localhost:9000/paraview

  # Handle WebSocket forwarding
  RewriteEngine On

  # This is the path the mapping file Jetty creates
  # path to proxy should match launcher.config
  RewriteMap session-to-port txt:C:/Apache24/proxy.txt

  # This is the rewrite condition. Look for anything with a sessionId= in the
  # query part of the URL and capture the value to use below.
  RewriteCond %{QUERY_STRING} ^sessionId=(.*)&path=(.*)$ [NC]

  # This does the rewrite using the mapping file and the sessionId
  RewriteRule ^/proxy.*$  ws://${session-to-port:%1}/%2  [P]
</VirtualHost>

Here is the launcher configuration:

{
  "configuration": {
    "host" : "localhost",
    "port" : 9000,
    "endpoint": "paraview",
  "content": "D:/paraview-remote-rendering-web/share/paraview-5.9/web/ParaViewWeb-SimpleDemo-master/js/www",
    "proxy_file" : "C:/Apache24/proxy.txt",
    "sessionURL" : "ws://paraview:80/proxy?sessionId=${id}&path=ws",
    "timeout" : 30,
    "log_dir" : "D:/paraview-remote-rendering-web/log/",
    "fields" : []
  },
  "resources" : [ {
  "host" : "localhost",
  "port_range" : [9001, 9999]
  } ],
  "properties" : {
    "python_exec" : "D:/paraview-remote-rendering-web/bin/pvpython.exe",
    "cloudcad": "D:/paraview-remote-rendering-web/share/paraview-5.9/web/ParaViewWeb-SimpleDemo-master/python/PVWSDServer.py"
  },
  "apps": {
    "cloudcad": {
        "cmd": [
            "${python_exec}", "-dr", "${cloudcad}", "--port", "${port}", "--authKey", "${secret}",  "--data", "${dataDir}", "--load-file", "${dataFile}"
        ],
        "ready_line" : "Starting factory"
    }
  }
}

So the question is what’s going on? Forgive me for being new to ParaViewWeb.

There are two other pieces of potentially useful information in the launcherLog:

2022-06-06 13:51:39,496:INFO:twisted:Timing out client: IPv4Address(type='TCP', host='127.0.0.1', port=50644)
2022-06-06 13:51:39,748:INFO:twisted:Timing out client: IPv4Address(type='TCP', host='127.0.0.1', port=50646)

When you are setting up apache like that, you are supposed to reach your app on http://localhost/ not localhost:9000/paraview.

Also you may want to look at trame which is the latest framework based on ParaViewWeb that allow quick development of viz apps in plain python.

I’m accessing apache’s test interface in this address form, not the content of ParaViewWeb:

I think the problem maybe thay on your first server configuratiom you set up port 80 instead of the port you intended

The good news is that you are reaching Apache now. The bad news is that it is not serving the content from D:/paraview-remote-rendering-web.

I guess you will have to see why your configuration of Apache is not used or not working. That will really be the first step knowing that the goal here is just serving files from your disk. After that you will have to make sure the websocket proxying actually work (also part of the config).

Yes, Sebastien. I am new to network service configuration.
Are there clearer instructions for using Apache for ParaViewWeb? Or my PVW needs some extra configuration to work with Apache.So far ALL I know is that I need to introduce Wslink’s smartConnect in index.js, and I wrote it like this:

import SmartConnect from 'wslink/src/SmartConnect';

const config = { sessionURL: 'ws://localhost:1234/ws' };
const smartConnect = SmartConnect.newInstance({ config });
...
smartConnect.connect();

Unfortunately we only have the following set of guides:

Most of them focus on Unix base system and not Windows but the guiding principal remain the same across OS.

If you are not that familiar with all of those but you can run a docker container within your windows. It might be much simpler to go that route.

Also you should really consider looking at trame and do your development with it as it is the framework that will have the most up-to-date infrastructure and documentation. Also the cookie cutter that come with it provide the initial infrastructure for building docker images to support multi-clients. The only caveat now is that we only provided bash script to encapsulate the docker commands. But a Windows version of them could be created, or you could simply type the command yourself with the proper arguments.

HTH

Is there an example of Docker working with ParaViewWeb on Windows 10?

I will try to deploy and run that setup first.
Once working and understood you can start adding your own code.

Can I build my own PVW Docker image?
I am using the version of Paraview 5.9, I see the version of the pre-built image is 5.7.

You sure can. The most recent one we pushed are available here but still in 5.8.

The pv- ones are coming from here. And the pvw- ones are coming from here

But the better approach that we are now taking with trame is to have a generic one with the apache/network setup and just add ParaView by downloading our pre-built version either for EGL or OSMesa.

My initial suggestion was to start with something easy that works rather than tackling the full image setup without much background on how it is suppose to work.

Hi Sebastien!
I tried again to configure Apache and the launcher to use ParaviewWeb. Now I can access the html content on http://localhost, but the rest is missing. I found a Websocket error in the browser console:

WebSocket connection to 'ws://localhost:1234/ws' failed: Error during WebSocket handshake: Unexpected response code: 404

Also, this is an error in the launcherLog.log:

INFO:twisted:"127.0.0.1" - - [11/Jul/2022:08:37:52 +0000] "GET /ws HTTP/1.1" 404 145 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)

I think there may be something wrong with the configuration of my launcher, so I hope to get help from PVW experts.
Here is the latest launcher and Apache configuration:
PVW configuration

Either your launcher or your client hard coding the port :1234.

Shouldn’t the client be hard coding? Like this:

import SmartConnect from 'wslink/src/SmartConnect';
const config = { sessionURL: 'ws://localhost:1234/ws' };
const smartConnect = SmartConnect.newInstance({ config });

Definitely not, you want things to be dynamic otherwise you can only have 1 server process and therefore only one client. (which is fine for the dev phase)

The role of the launcher is to start a new process for each client that connect to your service so nothing get shared across them.

Then apache handle the routing to link a session id to a specific process that is running on a given port.