It is a record of how I build an Nginx with Brotli compression and TLS 1.3 support.
I use it on my Linode VPS. It is a Nanon type of VPS at Fremont, CA, USA.
1GB RAM, 25GB storage, 1 CPU.
Ubuntu 18.04 LTS was installed on it.
Step 0, Build the system from Linode Dashboard.
Step 1, Update the system
I SSH to the server with user root.
apt updat apt upgrade
Step 2, Enable TCP BBR to improve network speed
sysctl net.ipv4.tcp_available_congestion_control
The above command should report
net.ipv4.tcp_available_congestion_control = cubic reno
To change it to bbr, opent the file /etc/sysctl.conf, and add following lines intot the end of the file.
net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
Save the file and enter the following command
sysctl -p
Step 3, Install Webmin 1.9.0
I like to use webmin as my web panel on VPS.
Enter the following command to install the latest webmin version 1.9.0
apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python wget http://prdownloads.sourceforge.net/webadmin/webmin_1.910_all.deb dpkg --install webmin_1.910_all.deb
Reboot the server, the ssh connection is lost.
Step 4, Add a new user
Sign in the webmin as user root by entering the URL into the browser https://ip.address.of.the.vps:10000
Add a new user, for example: davidyin and add sudo as the second group of this user.
From this point, I will use davidyin to do all the ssh jobs. I will not use root in terminal anymore.
Step 5 Build Nginx with TLS 1.3 and brotli now
SSH the VPS with user davidyin.
First, list the version of the software.
- Openssl: openssl-1.1.1b
- Nginx: nginx-1.17.0
- Brotli: ngx-brotli-0.13rc
Install the related software packages.
sudo apt install build-essential sudoapt install libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev
Prepare the source code.
Nginx:
wget https://nginx/org/download/nginx-1.17.0.tar.gz tar xvzfnginx-1.17.0.tar.gz rm nginx-1.17.0.tar.gz
Openssl:
wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz tar xvzf openssl-1.1.1b.tar.gz rm openssl-1.1.1b.tar.gz
Brotli:
git clone https://github.com/eustas/ngx_brotli.git cd ngx_brotli git submodule update --init --recursive
Compile Nginx
cd ~/nginx-1.17.0 ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/nginx.lock --user=www-data --group=www-data --with-openssl=../openssl-1.1.1b --with-openssl-opt=enable-tls1_3 --with-http_v2_module --with-http_ssl_module --with-debug --with-http_gunzip_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-threads --with-file-aio --add-module=../ngx_brotli make sudo make install
Make Nginx as a service
If you can not start Nginx as service by “sudo service nginx restart”, make a new file at /etc/systemd/system/nginx.service
cd /etc/systemd/system sudo nano nginx.service
Paste the following content:
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
Ente the command to check the version:
nginx version: nginx/1.17.0
built by gcc 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04)
built with OpenSSL 1.1.1b 26 Feb 2019
Now the Nginx server is supporting TLS 1.3 and Brotli compression.