Using NGINX as a Reverse Proxy
A reverse proxy allows you to run a Solid server on a local port and let the proxy handle traffic to public HTTP and HTTPS ports. The instructions below are for the Community Solid Server.
Prerequisites
In this example, we assume that:
- your server is running on
http://localhost:3000/
- the public URL of your reverse proxy is
https://solid.example/
- you have installed NGINX
and its configuration folder is
/etc/nginx/
- you have obtained (free) TLS certificates,
stored at
/etc/letsencrypt/live/solid.example/
Configuration
Add a new site to your NGINX configuration
by creating a file such as
/etc/nginx/sites-available/solid.example
with the following contents:
# The local Solid server instance
upstream community-solid-server {
server 127.0.0.1:3000;
}
# Redirect HTTP to HTTPS
server {
server_name solid.example;
listen 80;
return 301 https://$host$request_uri;
}
# Proxy traffic for https://solid.example/ to http://localhost:3000/
server {
server_name solid.example;
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/solid.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/solid.example/privkey.pem;
ssl_trusted_certificate /etc/ssl/certs/lets-encrypt-x3-cross-signed.pem;
# Include this for certificate renewal if you are using Let's Encrypt
include snippets/https.conf;
location ^~ /.well-known/acme-challenge/ {
root /var/www/solid.example; # or a folder of your choice
}
# Proxy all other traffic to the Solid server
location / {
# Delegate to the Solid server, passing the original host and protocol
proxy_pass http://community-solid-server$request_uri;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# Pass these headers from the Solid server back to the client
proxy_pass_header Server;
proxy_pass_header Set-Cookie;
# Enable Websocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
HTTPS configuration
We are reusing an HTTPS configuration file
at /etc/nginx/snippets/https.conf
,
which you should create if it does not exist:
# Generated by https://ssl-config.mozilla.org/
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
Activating the configuration
Restart NGINX to activate the new configuration:
sudo systemctl restart nginx