Table of Contents

NGINX

See Common Linux Commands for [start | restart | stop | status] service commands

  ## stop
  $ ps -ef | grep nginx
  $ kill -9 ${pid}
  ## test
  $ nginx -t

Installation

  $ sudo apt-get install nginx iptables-persistent

Setup

  ## allow ports 80,443
  $ sudo iptables -A INPUT -i lo -j ACCEPT
  $ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  $ sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
  $ sudo iptables -A INPUT -j DROP
  $ sudo iptables -S
  $ /etc/init.d/networking restart
  ## set up certificates and keys
  ssl:
      $ sudo mkdir /etc/nginx/ssl
      $ sudo cd /etc/nginx/ssl
      $ sudo openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/${site}.crt -keyout /etc/nginx/ssl/${site}.key
      $ sudo chmod 400 ${site}.key
      configuration:
          cert: /etc/nginx/ssl/${site}.crt
          key: /etc/nginx/ssl/${site}.key
  ## enable sites
  $ sudo ln -s /etc/nginx/sites-available/${site} /etc/nginx/sites-enabled/
  ## test
  ## restart

Configuration

  ## default config file
  config: /etc/nginx/sites-available/${site}
  $ sudo nano ${config}

Sample Configuration Options

simple:

  server {
      listen 80;
      server_name ${servername};
      access_log ${accesslog};
      error_log ${errorlog};
      root ${root};
      location / {
          try_files $uri /index.html;
      }
  }

simple_with_upstream:

  upstream ${upstreamname} {
      server ${server};
  }
  server {
      listen 80;
      server_name ${servername};
      access_log ${accesslog};
      error_log ${errorlog};
      location / {
          proxy_redirect off;
          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_pass http://${upstreamname};
      }
  }

simple_with_upstream_ssl:

  upstream ${upstreamname} {
      server ${server};
  }
  server {
      listen 80;
      server_name ${servername};
      return 301 https://$server_name$request_uri;
  }
  server {
      listen 443;
      server_name ${servername};
      access_log ${accesslog};
      error_log ${errorlog};
      ssl on;
      ssl_certificate /etc/letsencrypt/live/somedomain.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/somedomain.com/privkey.pem;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      ssl_ciphers 'EECHD+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
      location / {
          proxy_redirect off;
          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_pass http://${upstreamname};
      }
  }

simple_with_upstream_ssl_cache:

  upstream ${upstreamname} {
      server ${server};
  }
  proxy_cache_path /var/cache/nginx/${site} levels=1:2 keys_zone=${site}_cache:10m max_size=3g inactive=120m use_temp_path=off;
  server {
       listen         80;
       server_name    ${servername};
       return         301 https://$server_name$request_uri;
  }
  server {
      listen 443 ssl;
      server_name ${servername};
      ssl on;
      ssl_certificate ${cert};
      ssl_certificate_key ${key};
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
      ssl_prefer_server_ciphers on;
      location / {
          proxy_cache ${site}_cache;
          proxy_redirect off;
          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_pass http://${upstreamname};
      }
  }

standard:

  server {
       listen         80;
       server_name ${servername};
       location / {
              gzip off;
              proxy_set_header X-Forwarded-Ssl on;
              client_max_body_size 50M;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header Host $http_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;
              proxy_set_header X-Frame-Options SAMEORIGIN;
              proxy_pass http://127.0.0.1:${port};
       }
  }

standard_with_ssl:

  server {
       listen         80;
       server_name    ${servername};
       return         301 https://$server_name$request_uri;
  }
  server {
       listen 443 ssl;
       server_name ${servername};
       ssl on;
       ssl_certificate ${cert};
       ssl_certificate_key ${key};
       ssl_session_timeout 5m;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
       ssl_prefer_server_ciphers on;
       ssl_session_cache shared:SSL:10m;
       location / {
              gzip off;
              proxy_set_header X-Forwarded-Ssl on;
              client_max_body_size 50M;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header Host $http_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;
              proxy_set_header X-Frame-Options SAMEORIGIN;
              proxy_pass http://127.0.0.1:${port};
       }
  }

standard_with_upstream_ssl:

  upstream ${upstreamname} {
      server ${server};
  }
  proxy_cache_path /var/cache/nginx/${site} levels=1:2 keys_zone=${site}_cache:10m max_size=3g inactive=120m use_temp_path=off;
  server {
       listen         80;
       server_name    ${servername};
       return         301 https://$server_name$request_uri;
  }
  server {
       listen 443 ssl;
       server_name ${servername};
       ssl on;
       ssl_certificate ${cert};
       ssl_certificate_key ${key};
       ssl_session_timeout 5m;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
       ssl_prefer_server_ciphers on;
       ssl_session_cache shared:SSL:10m;
       location / {
              access_log      /var/log/nginx/${site}.access.log;
              error_log       /var/log/nginx/${site}.error.log;
              gzip off;
              proxy_set_header X-Forwarded-Ssl on;
              client_max_body_size 50M;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header Host $http_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;
              proxy_set_header X-Frame-Options SAMEORIGIN;
              proxy_pass http://${upstreamname};
       }
  }

standard_with_upstream_ssl_websocket:

  upstream ${upstreamname} {
      server ${server};
  }
  proxy_cache_path /var/cache/nginx/${site} levels=1:2 keys_zone=${site}_cache:10m max_size=3g inactive=120m use_temp_path=off;
  server {
       listen         80;
       server_name    ${servername};
       return         301 https://$server_name$request_uri;
  }
  server {
      listen 443 ssl;
      server_name ${servername};
      ssl on;
      ssl_certificate ${cert};
      ssl_certificate_key ${key};
      ssl_session_timeout 5m;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
      ssl_prefer_server_ciphers on;
      ssl_session_cache shared:SSL:10m;
      location /api/v3/users/websocket {
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          client_max_body_size 50M;
          proxy_set_header Host $http_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;
          proxy_set_header X-Frame-Options SAMEORIGIN;
          proxy_buffers 256 16k;
          proxy_buffer_size 16k;
          proxy_read_timeout 600s;
          proxy_pass http://${upstreamname};
      }
      location / {
          client_max_body_size 50M;
          proxy_set_header Connection "";
          proxy_set_header Host $http_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;
          proxy_set_header X-Frame-Options SAMEORIGIN;
          proxy_buffers 256 16k;
          proxy_buffer_size 16k;
          proxy_read_timeout 600s;
          proxy_cache ${site}_cache;
          proxy_cache_revalidate on;
          proxy_cache_min_uses 2;
          proxy_cache_use_stale timeout;
          proxy_cache_lock on;
          proxy_pass http://${upstreamname};
      }
  }

Errors

  See: < Notes/Server/misc.notes >
      ## status
      services:
          servicename: nginx
              # Apr 27 16:09:18 mattermost systemd[1]: nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument
      $ sudo mkdir /etc/systemd/system/nginx.service.d
      $ sudo printf "[Service]\nExecStartPost=/bin/sleep 0.1\n" > /etc/systemd/system/nginx.service.d/override.conf
      ## reload daemon
  ## if site keeps redirecting to a particular subdomain, check that all the server_names are correct

Logs

  /var/log/nginx/access.log
  /var/log/nginx/error.log