Install Nginx from source code

I am a Software Engineer. I have worked with different languages like NodeJS and Python. I have keen interest in Backend Engineering, Cloud Native Technologies and System Architecture.
Search for a command to run...

I am a Software Engineer. I have worked with different languages like NodeJS and Python. I have keen interest in Backend Engineering, Cloud Native Technologies and System Architecture.
No comments yet. Be the first to comment.
What is a Bastion host? A bastion host is a server whose purpose is to provide access to a private network from an external network, such as the Internet. Because of its exposure to potential attack, a bastion host must minimize the chances of penetr...

What is helm? Helm is a package manager for Kubernetes. It makes updates and rollback of applications more efficient and improves team collaboration. Kubernetes objects are challenging to manage Helm automates maintenance of YAML manifests for Kubern...

Introduction Automation is the key to streamlining your work processes for any software development project. GitHub actions allow you to add your software development lifecycle workflows directly to your repository. GitHub Actions is a continuous int...

Flake8 is a popular lint wrapper for python. In this article, we will understand the uses of flake8 against our python projects. What is flake8? Install flake8 in your project Run flake8 against your project Configure flake8 in config.cfg What ...

In this article, we will go through the installation of Kubernetes in your local system and run a simple nginx server via kubernetes. We need to follow this process Introduction to kubernetes Install minikube locally Run your first pod Access kub...

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.
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/
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 .gz file.
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
./configure
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=path sets the name of an Nginx executable file. This name is used only during installation.
--conf-path=path sets the name of an nginx.conf configuration file. If needs be, nginx can always be started with a different configuration file, by specifying it in the command-line parameter -c file.
--error-log-path=path sets the name of the primary error, warnings, and diagnostic file.
--http-log-path=path sets the name of the primary request log file of the HTTP server.
--pid-path=path sets the name of an nginx.pid file that will store the process ID of the main process.
--with-pcre forces the usage of the PCRE library. (PCRE stands for Perl Compatible Regular Expressions which implements a regular expression engine.)
--with-http_ssl_module enables 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
make
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.
sudo nginx
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
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 /lib/systemd/system/ .
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
Eureka!!
We succeeded in finally installing Nginx from the source file and running Nginx as a service.
Happy Learning !!