LEMP stack is a group of open source software to get web servers up and running. The acronym stands for Linux, nginx, MySQL, and PHP. In short, people who are looking into nginx is really looking for better web server as compare to apache which nginx perform better in many aspect although apache is still the most usage web server around due to its stability!
Requirement
Before we can start with all the installation for our fresh installed Centos server, we will need to download and install 2 extra repositories to our server. Below is a 32 bits Centos 6 installation
sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
64 bits Centos 6 installation you will need to fire the below command,
sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
We will need to do this in order to get nginx and php-fpm off our centos machine since its not available on our fresh Centos installation.
Install Nginx on Centos
Firstly we will need to install our Nginx web server by firing the below command,
sudo yum install nginx -y
now we will need to update our nginx configuration at /etc/nginx/nginx.conf to the following
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes 4;
worker_rlimit_nofile 8192;
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# Only for Linux 2.6 or >
use epoll;
# Accept as many connections as possible
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nodelay on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
client_body_timeout 30;
client_header_timeout 30;
send_timeout 30;
client_max_body_size 8M;
reset_timedout_connection on;
# Gzip module configuration
gzip on;
gzip_disable "MSIE [1-6].(?!.*SV1)";
gzip_vary on;
gzip_comp_level 3;
gzip_proxied any;
gzip_buffers 16 8k;
#gzip on;
# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
include /etc/nginx/conf.d/*.conf;
}
The Above configuration allows nginx web server configuration to be setup properly with gzip enabled. Next we need to edit /etc/nginx/conf.d/default.conf to the following
server {
listen 80 default_server;
server_name server.hungred.com;
root /usr/share/nginx/html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
The above setup our default directory for this server so if you fire up your server hostname, you will reach the directory as written on the default conf file. Now, we will need to test our nginx configuration before starting it,
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Once this is done, our nginx web server has been setup and we will need to make sure that it will starts itself every times when it restart by setting up on chkconfig
sudo chkconfig --levels 235 nginx on
All done, we'll need to start up nginx
service nginx start
and we are good to go, you should be able to test whether this is working by firing up your ip address. And you can know your ip address by doing this
ifconfig eth0 | grep inet | awk '{ print $2 }'
But you should know 😉
Install PHP on Centos
Next, we will need to install php by firing
sudo yum install php-cli php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy
Now edit php.ini file and find "cgi.fix_pathinfo" section then set it to 0 and save it.
Install APC on Centos
Next, we will need to install php-apc by firing
sudo yum install php-apc -y
We will need to update our php.ini file so that apc.so is enabled and is working fine. Edit the file at /etc/php.d/apc.ini and make sure that apc.so is enabled
; Enable apc extension module
extension = apc.so
Now we will need to install php-fpm
Install PHP-FPM on Centos
In order for php-fpm to work, we'll need to install it by running
yum install php-fpm -y
Once php-fpm is installed, we will need to configure it. Open up the file at /etc/php-fpm.d/www.conf and look for the following lines
; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
and change it to
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
we are doing this because we are running nginx instead of apache. Next we will need to setup chkconfig so that it will starts itself when our server restart
sudo chkconfig --levels 235 php-fpm on
Lastly we need to start php-fpm
service php-fpm restart
And we are good to go!
Install MySQL on Centos
We will begin installing MySQL server into our machine,
sudo yum install mysql mysql-server
Once the installation is completed, we will need to secure it!
sudo /usr/bin/mysql_secure_installation
It will prompt and ask you for your current root password.
Since you just installed MySQL, you most likely won’t have one, so leave it blank by pressing enter.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Then the prompt will ask you if you want to set a root password. Go ahead and choose Y and follow the instructions.
At the end, MySQL will reload and implement the changes.
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
we need to setup chkconfig so that mysql will start itself upon reboot,
sudo chkconfig --levels 235 mysqld on
Next we start our database!
service mysqld restart
And we are good here.
Install Varnish on Centos
First off, install varnish!
sudo yum install varnish
Then we will configure varnish to act as the middle man between our visitors and our web server! Open up varnish configure file at /etc/sysconfig/varnish and change the port from
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=8080
to
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
this is to ensure that our varnish will be listening to port 80 which is what our nginx server is currently doing! So we will need to update our nginx configuration so that it will listen to other port. This is my blog nginx virtual host which is listening to port 8080 instead of 80, you'll need to change that from the original 80 to 8080 so that it won't crash with varnish!
server {
listen 8080;
server_name hungred.com www.hungred.com;
root /var/www;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
P.S: i have alter a bit on the configuration to avoid unnecessary headache lol. Once this is done you will still have to configure varnish! Open up the file at /etc/varnish/default.vcl and make sure that your server ip and port is correctly updated.
backend default {
.host = "127.0.0.1";
.port = "80";
}
to
backend default {
.host = "12.23.18.1";
.port = "8080";
}
The above means that all request from varnish that it doesn't have cache on will redirect to port 8080 which is where our nginx server lies! Ok, so same stuff here, we will need to make sure varnish starts itself or else all our web sites on this web server will die if it got rebooted!
chkconfig varnish on
Finally, reboot both nginx and varnish in this sequence!
service nginx restart
this will change nginx listening port from 80 to 8080 and varnish from 8080 to 80! And we are done!
Summary
Ok to be honest, this tutorial was setup using the same exact same steps as how i've setup for this website and also prove whatever is written here works pretty well! So try it out and let me know if you faced any issue with your installation!