Nginx quickstart

1 Install nginx

# For CentOS
$ yum install nginx

# For Ubuntu
$ apt install nginx

2 nginx static website

Create file /etc/nginx/conf.d/www.example.com.conf

server {
  listen 80;
  listen [::]:80;
  root /var/www/www.example.com;
  index index.html;
  server_name example.com www.example.com;
  location / {
    try_files $uri $uri/ =404;
  }
}

3 nginx application server using proxy_pass

Create file /etc/nginx/conf.d/app.example.com.conf

server {
    server_name app.example.com;  # Replace DOMAINNAME with the actual domain
    listen 80;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        # Replace this INTERNALIPADDRESS:PORT with the IP and port
        # combination for the server on your network handling the
        # above-specified domain name.
        proxy_pass http://192.168.122.29:3001;
    }
}

4 Restart nginx

$ systemctl restart nginx

5 Enable firewall to port 80 and 443

Make sure ports 80 and 443 are open.

6 Install certbot

# For CentOS
$ yum install epel-release
$ yum install certbot-nginx

# For Ubuntu
$ apt install software-properties-common
$ add-apt-repository ppa:certbot/certbot
$ apt update
$ apt install python-certbot-nginx

7 Add letscrypt acme challenge

Add below configuration to nginx server configuration

location ^~ /.well-known/acme-challenge {
    root /var/www/letscrypt/;
    default_type "text/plain";
}
location = /.well-known/acme-challenge/ {
    return 404;
}

8 Use certbot

$ sudo certbot --nginx -d www.example.com

If using cloudflare, add parameter --preferred-challenges http-01

Generated nginx server configuration for SSL:

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/recording.qa.wishlife.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/recording.qa.wishlife.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

If redirection is enabled:

server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    server_name www.example.com;
    listen 80;
    return 404; # managed by Certbot
}

OR only generate certificate

$ certbot certonly --webroot -w /var/www/www.example.com -d www.example.com

9 Backup folder /etc/letscrypt

Make sure to backup /etc/letsencrypt for certificate persistence.

10 Explanation of let’s encrypt acme challenge

See: Let’s Encrypt nginx acme challenge configuration

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/letsencrypt;
}

location = /.well-known/acme-challenge/ {
    return 404;
}