How to Renew SSL Certificate on Magento 2 / NGINX?

I have installed lnmp (Linux, Nginx, MySQL, and PHP) environments for www.cheapglasses.net. I use the free SSL Certificate – Let’s Encrypt. By default, LNMP will renew Let’s Encrypt automatically. Today, I found https://www.cheapglasses.net not working, and I found Let’s Encrypt failed to be renewed automatically.

I googled “Magento 2 let’s encrypt auto renew failed” and found the following method to solve the issue. I add the following code to cheapglasses.conf file:

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root         /home/wwwroot/www.cheapglasses.net;
    }

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

The full cheapglasses.conf contents are:

#  If enable elastic search, then remove #, by Cheapglasses.net 
#  upstream fastcgi_backend {
 #   server   unix:/tmp/php-cgi.sock;
#  }

server
{

    listen 443 ssl http2;
    #listen [::]:443 ssl http2;
    server_name www.cheapglasses.net cheapglasses.net;
    index index.php;
    set $MAGE_ROOT /home/wwwroot/www.cheapglasses.net;

    root $MAGE_ROOT/pub;

    ssl_certificate /usr/local/nginx/conf/ssl/www.cheapglasses.net/fullchain.cer;
    ssl_certificate_key /usr/local/nginx/conf/ssl/www.cheapglasses.net/www.cheapglasses.net.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    ssl_session_cache builtin:1000 shared:SSL:10m;
    # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

    autoindex off;
    charset UTF-8;
    error_page 404 403 = /errors/404.php;
    #add_header "X-UA-Compatible" "IE=Edge";

    # Deny access to sensitive files
    location /.user.ini {
        deny all;
    }
    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root         /home/wwwroot/www.cheapglasses.net;
    }

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

    # PHP entry point for setup application
    location ~* ^/setup($|/) {
        root $MAGE_ROOT;
        location ~ ^/setup/index.php {
           fastcgi_pass   unix:/tmp/php-cgi.sock;

           fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
           fastcgi_param  PHP_VALUE "memory_limit=756M \n max_execution_time=600";
           fastcgi_read_timeout 600s;
           fastcgi_connect_timeout 600s;

           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
           include        fastcgi_params;
        }

        location ~ ^/setup/(?!pub/). {
            deny all;
        }

        location ~ ^/setup/pub/ {
            add_header X-Frame-Options "SAMEORIGIN";
        }
    }

    # PHP entry point for update application
    location ~* ^/update($|/) {
        root $MAGE_ROOT;

        location ~ ^/update/index.php {
            fastcgi_split_path_info ^(/update/index.php)(/.+)$;
            fastcgi_pass   unix:/tmp/php-cgi.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            include        fastcgi_params;
        }

        # Deny everything but index.php
        location ~ ^/update/(?!pub/). {
            deny all;
        }

        location ~ ^/update/pub/ {
            add_header X-Frame-Options "SAMEORIGIN";
        }
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
        proxy_ssl_session_reuse off;
    }

    location /pub/ {
        location ~ ^/pub/media/(downloadable|customer|import|custom_options|theme_customization/.*\.xml) {
            deny all;
        }
        alias $MAGE_ROOT/pub/;
        add_header X-Frame-Options "SAMEORIGIN";
    }

    location /static/ {
        # Uncomment the following line in production mode
        # expires max;

        # Remove signature of the static files that is used to overcome the browser cache
        location ~ ^/static/version {
            rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
        }

        location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|html|json)$ {
            add_header Cache-Control "public";
            add_header X-Frame-Options "SAMEORIGIN";
            expires +1y;

            if (!-f $request_filename) {
                rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }
        location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
            add_header Cache-Control "no-store";
            add_header X-Frame-Options "SAMEORIGIN";
            expires    off;

            if (!-f $request_filename) {
               rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }
        if (!-f $request_filename) {
            rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
        }
        add_header X-Frame-Options "SAMEORIGIN";
    }

    location /media/ {

    ## The following section allows to offload image resizing from Magento instance to the Nginx.
    ## Catalog image URL format should be set accordingly.
    ## See https://docs.magento.com/user-guide/configuration/general/web.html#url-options
    #   location ~* ^/media/catalog/.* {
    #
    #       # Replace placeholders and uncomment the line below to serve product images from public
    #       # See examples of S3 authentication at https://github.com/anomalizer/ngx_aws_auth
    #       # resolver 8.8.8.8;
    #       # proxy_pass https://<bucket-name>.<region-name>.amazonaws.com;
    #
    #       set $width "-";
    #       set $height "-";
    #       if ($arg_width != '') {
    #           set $width $arg_width;
    #       }
    #       if ($arg_height != '') {
    #           set $height $arg_height;
    #       }
    #       image_filter resize $width $height;
    #       image_filter_jpeg_quality 90;
    #   }

        try_files $uri $uri/ /get.php$is_args$args;

        location ~ ^/media/theme_customization/.*\.xml {
            deny all;
        }

        location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
            add_header Cache-Control "public";
            add_header X-Frame-Options "SAMEORIGIN";
            expires +1y;
            try_files $uri $uri/ /get.php$is_args$args;
        }
        location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
            add_header Cache-Control "no-store";
            add_header X-Frame-Options "SAMEORIGIN";
            expires    off;
            try_files $uri $uri/ /get.php$is_args$args;
        }
        add_header X-Frame-Options "SAMEORIGIN";
    }

    location /media/customer/ {
        deny all;
    }

    location /media/downloadable/ {
        deny all;
    }

    location /media/import/ {
        deny all;
    }

    location /media/custom_options/ {
        deny all;
    }

    location /errors/ {
        location ~* \.xml$ {
            deny all;
        }
    }

    # PHP entry point for main application
    location ~ ^/(index|get|static|errors/report|errors/404|errors/503|health_check)\.php$ {
        try_files $uri =404;
        fastcgi_pass   unix:/tmp/php-cgi.sock;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;

        fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
        fastcgi_param  PHP_VALUE "memory_limit=756M \n max_execution_time=18000";
        fastcgi_read_timeout 600s;
        fastcgi_connect_timeout 600s;

        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    gzip on;
    gzip_disable "msie6";

    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_proxied any;
    gzip_types
    text/plain
    text/css
    text/js
    text/xml
    text/javascript
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/xml+rss
    image/svg+xml;
    gzip_vary on;

    # Banned locations (only reached if the earlier PHP entry point regexes don't match)
    location ~* (\.php$|\.phtml$|\.htaccess$|\.git) {
        deny all;
    }
    include enable-php.conf;

}

server {
listen 80;
server_name www.cheapglasses.net cheapglasses.net;
location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root         /home/wwwroot/www.cheapglasses.net;
}

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

rewrite ^(.*)$ https://${server_name}$1 permanent;
}

Restart the Nginx by running:

lnmp restart

Next, renew Let’s Encrypt:

acme.sh --renew -d www.cheapglasses.net
Published
Categorized as Magento