How To Compile And Install Custom Version Of NGINX ON CentOS/RHEL 6/7

There are many scenarios when a server admin has to install the NGINX web server by compiling it and the fact is, compiling and installing from the sources provides you more flexibility. Also compiling give you the ease of adding particular NGINX modules or 3rd party modules and helps you in applying the latest security patches.

Well, when you are installing NGINX or any application from the source you need to choose any one version given below. There are two kinds of versions for NGINX

  1. The mainline version: It’s the latest one and has almost every bug fixed with new features. It is included some experimental modules but it’s reliable to use.
  2. The stable version: It includes critical bugs but with no new feature. The stable version is recommended for production servers.

Scenario:

Host OS: CentOS/RHEL 6/7
Host IP: 192.168.1.62
RAM: 4GB Memory
Network Port: 1GB/s

So Let’s Start

Step 1: Install Dependencies for NGINX

To complete NGINX from the source we need to install few dependencies. This includes development libraries along with source code compilers.

yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel

Step 2: Download Source Code

Now get the download link for NGINX source code from its official website I am using the “1.10.2” version. Let’s get this NGINX version number from the link

cd /usr/share/
NginxVersion="1.10.2"
wget http://nginx.org/download/nginx-$NginxVersion.tar.gz
tar -xvzf nginx-$NginxVersion.tar.gz 
rm -rf nginx-$NginxVersion.tar.gz
ln -sf nginx-$NginxVersion nginx

Step 3: Preparation for Compiling

When we compile NGINX we need to know a few of its options with which we are going to compile it. The below command will give you every option

cd nginx
./configure --help
--help print this message
--prefix=PATH set installation prefix
--sbin-path=PATH set nginx binary pathname
.....................................................
................ It's A Long List ...................
.....................................................
--with-libatomic force libatomic_ops library usage
--with-libatomic=DIR set path to libatomic_ops library sources--with-openssl=DIR set path to OpenSSL library sources
--with-openssl-opt=OPTIONS set additional build options for OpenSSL
--with-debug enable debug logging

Well, it’s a huge list and you can choose options according to your need but here we need to choose basic Requirements for installation because we need the basic variables to override and to use default system paths at /etc/. We want a thing to look similar like we are installing NGINX using via rpm. The user and group options are used to run the NGINX worker processes in non-privileged.



--user
--group
--prefix
--sbin-path
--conf-path
--pid-path
--lock-path
--error-log-path
--http-log-path

Learn few more Options

  1.  –with-http_gzip_static_module option is used enable gzip in NGINX. It is recommended for reducing the size of information sent
  2.  –with-http_stub_status_module option enables other plugins over NGINX to allow us to get the status. It is recommended for getting stats
  3. –with-http_ssl_module – required if you want to run an HTTPS server.
  4. –with-pcre option will enable Regular Expression Matching. Using this  you will find more use once you start adding and matching routes
  5. –with-file-aio – enables asynchronous I/O to use this if are allowing users to download static files)
  6. –with-http_realip_module is used for getting the IP of the client when behind a load balancer.
  7. –without-http_scgi_module – Disable SCGI module (normally used when running CGI scripts)
  8. –without-http_uwsgi_module – Disable UWSGI module (normally used when running CGI scripts)
  9. –without-http_fastcgi_module – Disable FastCGI module (normally used when running CGI scripts)

Step 4: Compile NGINX

Now from step 3, we have chosen our option and now we can compile our NGINX with our specified option like below

./configure \
--user=nginx \
--group=nginx \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--with-file-aio \
--with-http_realip_module \
--without-http_scgi_module \
--without-http_uwsgi_module \
--without-http_fastcgi_module

After Completion Run the below command

make
make install

Step 5: Setting UP Scripts and NGINX

To initialize or to run NGINX we need a user. The given below command is the one-time command which will add the user for running NGINX

useradd -r nginx

Now We will set up init/systemd scripts to manage the Nginx service.



For Centos/RHEL 6/7: Run The Following Command

We will save this file as /etc/init.d/nginx

wget -O /etc/init.d/nginx https://raw.githubusercontent.com/kapendra007/NGINX/eadb7459650c04caeb210fcd3c1691046e1feb89/NginxFilesDefault/etc-init-nginx-centos6.txt

Make File executable

chmod +x /etc/init.d/nginx

Enable service For system boots:

chkconfig --add nginx
chkconfig --level 345 nginx on

Step 6: Configuring Nginx

We have successfully set up basic requirements for the NGINX server. Now, we need to set a configuration file for running an NGINX server by configuring /etc/nginx/nginx.conf. To configure this file you may download this from my repository or copy-paste your required blocks.

But we really need to set up  types_hash_bucket_size and server_names_hash_bucket_size. To get these setup you should run the following command but before doing this I would recommend taking e a backup of nginx.conf

wget -O /etc/nginx/nginx.conf https://raw.githubusercontent.com/kapendra007/NGINX/master/NginxFilesDefault/nginx.conf

Now, start the server. This will start it on Port 80 according to the downloaded nginx.conf file

service nginx start

Step 7: Check Your Work

We have successfully compiled the NGINX as same as it would have been done through rpm or yum. Now you may extend its capabilities by adding modules. But Before this, we have to check that our compiled NGINX server is working or not. So just open your browser and hit http://ServerIP/ Well in my case I will hit http://192.168.1.62/

How To Compile And Install Custom Version Of NGINX ON CentOS/RHEL 6/7

And if you can see the above page then it’s a success.

Upgrading To The Latest Version

Now quickly learn how to update your running compiled running NGINX server to a new version or downgrading it. This technique is also useful in adding modules to the NGINX server.




For this example, I am updating 1.10.2 to 1.10.3. Well if you are looking for some other different version then you may get the version number from the link

cd /usr/share/ 
NginxVersion="1.10.3"

Download The TAR And Extract

wget http://nginx.org/download/nginx-$NginxVersion.tar.gz
tar -xzf nginx-$NginxVersion.tar.gz
rm -rf nginx-$NginxVersion.tar.gz

Remove Softlink From the Previous Version And Recreate Softlink With New Version

rm nginx 
ln -sf nginx-$NginxVersion nginx

Compile New NGINX Version

cd nginx
./configure \
--user=nginx \
--group=nginx \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--with-file-aio \
--with-http_realip_module \
--without-http_scgi_module \
--without-http_uwsgi_module \
--without-http_fastcgi_module
make
make install

Restart Your Web Server

service nginx restart

NOTE : Don’t forget to move your HTML content from /usr/share/nginx-1.10.2/html/ To /usr/share/nginx-1.10.3/html/

Well, this was a really quick method of compiling an NGINX web server. If you like this article please do share this. In our next article, we will learn to learn reverse proxy.