Install Nginx from source code
5 min read
Nginx is a web server that works very well as a reverse proxy server and is also very effective in load balancing, media streaming, serving static files and caching. Nginx also solves the C10k problem as it can serve 10k concurrent connections.
Package installation vs Source Code installation
Nginx can be installed through the package manager in ubuntu
sudo apt install nginx . But it will install all the modules available in Nginx. Most of them might not be required for you. So, to avoid unnecessary module installation and have more control over your Nginx service, you can install it from the source.
Please visit the official Nginx-doc for more details on modules, https://nginx.org/en/docs/
Downloading the source code
Let's get started with the installation.
If you already have Nginx installed, then please remove it before instantiating the installation.
sudo apt purge nginx nginx-common nginx-core
We need to download the source file in the system. Go to the directory where you want to keep the Nginx source files. Here you can find the updated Nginx version file link to download https://nginx.org/en/download.html .
mkdir nginx cd nginx wget https://nginx.org/download/nginx-1.23.3.tar.gz
Now let's extract the file from the zip file and delete the
tar -zxvf nginx-1.23.3.tar.gz rm -rf nginx-1.23.3.tar.gz
We need to install
C compiler for the installation. So we need to install the build-essential in ubuntu.
sudo apt install build-essential
Now you can run the following command
You will get the following error output.
./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option.
To resolve these errors, we need to install some packages in our system.
sudo apt install libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
libpcer3 is to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language.
zlib1g library is used for implementing compression methods for creating gzip files.
libssl is used for the implementation of the SSL and TLS cryptographic protocols.
./configure \ > --sbin-path=/usr/bin/nginx \ > --conf-path=/etc/nginx/nginx.conf \ > --error-log-path=/var/log/nginx/error.log \ > --http-log-path=/var/log/nginx/access.log \ > --with-pcre \ > --pid-path=/var/run/nginx.pid > --with-http_ssl_module
The main benefit of installing Nginx through source code is that you only need to install the modules you need, unlike the package installation where you will install all the modules.
For a detailed understanding of the options available for configuration in nginx, please visit this awesome clean documentation provided on the official site https://nginx.org/en/docs/configure.html
Let's go through each of these parameters mentioned in the configuration briefly. I took the details from the official doc.
--sbin-path=pathsets the name of an Nginx executable file. This name is used only during installation.
--conf-path=pathsets the name of an
nginx.confconfiguration file. If needs be, nginx can always be started with a different configuration file, by specifying it in the command-line parameter
--error-log-path=pathsets the name of the primary error, warnings, and diagnostic file.
--http-log-path=pathsets the name of the primary request log file of the HTTP server.
--pid-path=pathsets the name of an
nginx.pidfile that will store the process ID of the main process.
--with-pcreforces the usage of the PCRE library. (PCRE stands for Perl Compatible Regular Expressions which implements a regular expression engine.)
--with-http_ssl_moduleenables building a module that adds the HTTPS transfer protocol to an HTTP server.
You should be able to see your nginx configure as per the parameters you mentioned. In your terminal you should be able to see
Configuration summary + using system PCRE library + using system OpenSSL library + using system zlib library nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/bin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/etc/nginx" nginx configuration file: "/etc/nginx/nginx.conf" nginx pid file: "/var/run/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"
Let's install nginx in our system by running the following commands
This will create the binary files for installation.
sudo make install
This will install the file in your system.
Now that you've installed Nginx on your machine, let's start it.
If you visit http://127.0.0.1/ from your browser, you will be able to see nginx's default page there.
sudo nginx -s stop
Add Nginx as a service
You should add Nginx as a service in your system.
To add Nginx as a systemd service, you need to add a service called
nginx.service in the directory
sudo nano /lib/systemd/system/nginx.service
Add the following content to your service file and save it.
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/bin/nginx -t ExecStart=/usr/bin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
Now, please restart your system.
Then run this command in the terminal
sudo systemctl start nginx
Now if you visit http://127.0.0.1/ from your browser, you will be able to see Nginx's default page there.
To start nginx by default on reboot you need to run this command
sudo systemctl enable nginx
We succeeded in finally installing Nginx from the source file and running Nginx as a service.
Happy Learning !!