worker_processes 2;
error_log   /var/logs/nginx/mydomain.error.log;
pid /var/run/nginx.pid;
include /usr/share/nginx/modules/*.conf; # See /usr/share/doc/nginx/README.dynamic.

events {
    worker_connections 1024; ## Default: 1024
    use epoll; # http://nginx.org/en/docs/events.html
    multi_accept on; # http://nginx.org/en/docs/ngx_core_module.html#multi_accept
}

# Core Modules Docs:
# http://nginx.org/en/docs/http/ngx_http_core_module.html
http {
    include    '/usr/local/openresty/nginx/conf/mime.types';
    default_type application/octet-stream;

    keepalive_timeout 65;
    keepalive_requests 100000;
    tcp_nopush on;
    tcp_nodelay on;

    # lua_ settings
    #
    lua_package_path '/usr/local/openresty/lualib/?.lua;;';
    lua_shared_dict discovery 1m; # cache for discovery metadata documents
    lua_shared_dict jwks 1m;      # cache for JWKs
    # lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;

    variables_hash_max_size 2048;
    server_names_hash_bucket_size 128;
    server_tokens off;

    resolver 8.8.8.8 valid=30s ipv6=off;
    resolver_timeout 11s;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # Nginx `listener` block
    server {
        listen [::]:80 default_server;
        listen 80;
        # listen      443 ssl;
        access_log  /var/logs/nginx/mydomain.access.log;

        # Domain to protect
        server_name 127.0.0.1 localhost; # mydomain.com;
        proxy_intercept_errors off;
        # ssl_certificate /etc/letsencrypt/live/mydomain.co.uk/fullchain.pem;
        # ssl_certificate_key /etc/letsencrypt/live/mydomain.co.uk/privkey.pem;
        gzip on;
        gzip_types text/css application/javascript application/json image/svg+xml;
        gzip_comp_level 9;
        etag on;

        # https://github.com/bungle/lua-resty-session/issues/15
        set $session_check_ssi off;
        lua_code_cache off;
        set $session_secret Eeko7aeb6iu5Wohch9Loo1aitha0ahd1;
        set $session_storage cookie;

        server_tokens off; # Hides server version num

        # Reverse Proxy for `orthanc` admin
        #
        location /pacs-admin/ {

          proxy_http_version 1.1;

          proxy_set_header Host               $host;
          proxy_set_header X-Real-IP          $remote_addr;
          proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto  $scheme;

          expires           0;
          add_header        Cache-Control private;

          proxy_pass        http://orthanc:8042/;
        }

        # Reverse Proxy for `orthanc` APIs (including DICOMWeb)
        #
        location /pacs/ {

          proxy_http_version 1.1;

          proxy_set_header Host               $host;
          proxy_set_header X-Real-IP          $remote_addr;
          proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto  $scheme;

          expires           0;
          add_header        Cache-Control private;

          proxy_pass        http://orthanc:8042/;

          # By default, this endpoint is protected by CORS (cross-origin-resource-sharing)
          # You can add headers to allow other domains to request this resource.
          # See the "Updating CORS Settings" example below
        }

        # Do not cache sw.js, required for offline-first updates.
        location /sw.js {
          add_header Cache-Control "no-cache";
          proxy_cache_bypass $http_pragma;
          proxy_cache_revalidate on;
          expires off;
          access_log off;
        }

        # Single Page App
        # Try files, fallback to index.html
        #
        location / {
          alias  /var/www/html/;
          index index.html;
          try_files $uri $uri/ /index.html;
          add_header Cache-Control "no-store, no-cache, must-revalidate";
        }

        # EXAMPLE: Redirect server error pages to the static page /40x.html
        #
        # error_page 404 /404.html;
        #     location = /40x.html {
        # }

        # EXAMPLE: Redirect server error pages to the static page /50x.html
        #
        # error_page 500 502 503 504 /50x.html;
        #    location = /50x.html {
        # }
    }
}
