LEMP server
A lemp server runs Nginx web server along with Php and Mysql or MariaDB on a Linux system. Nginx is increasing becoming popular because of its lightweight structure and ability to handle large amounts of traffic in an optimum manner.
Mariadb is the replacement for mysql because mysql is not very free anymore. In this tutorial we shall be setting up Nginx with Php FPM on CentOS. The instructions to install MariaDB shall be covered in another post.
CentOS is a very popular os for linux based web servers. CentOS (Community Enterprise Operating System) is based on RHEL (RedHat Enterprice Linux) and is 100% binary compatible with it. For us it simply means that its similar to rhel in its working and environment and that we have the handy yum command available to install software easily from the repositories. In this example we shall be working on CentOS 6.4 which, at the time of this post is a recent version.
Install Nginx
The first step is to install Nginx web server. Nginx is not available in the default CentOS repositories but nginx provides centos specific repositories for easy use.
Add the nginx repository
We create a repository file in /etc/yum.repos.d directory
$ nano /etc/yum.repos.d/nginx.repo
Now open the file and add the following lines. These instructions are provided by Nginx directly.
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
Save and close. Now nginx can be installed.
$ yum install nginx
The above will download and install the nginx web server and make it ready to use.
After the installation completes, its time to do some inspection. First use the service command to check the status of nginx.
[root@dhcppc2 ~]# service nginx status nginx is stopped
The above shows that nginx service is there but is stopped. Next check the configuration using the t option with nginx command.
[root@dhcppc2 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
The above command tells that the configuration is OK and all set to run. And most importantly, it also tells the location of the nginx configuration file. For creating virtual hosts/multiple domains, its important to create separate configuration files for each host. The virtual hosts configurations are located at /etc/nginx/conf.d/
OK, now lets start nginx server.
[root@dhcppc2 conf.d]# service nginx start Starting nginx: [ OK ]
Now nginx is up and running. Find the ip address of the nginx server using ifconfig and connect to that ip from a browser to test it out.
http://192.168.1.4/
You might have to open port 80 on the centos server, if it is not already open. Check this tutorial on how to open http port on centos. Once its open the ip address of the nginx server should load the page with content like this
Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.
Creating virtual host
Virtual hosts or "Server Blocks" as nginx calls them, allow nginx to serve multiple hosts based on a name. For example it can host abc.com and cde.com together. All it needs is a configuration file for each host containing the host specific settings like root directory etc.
The /etc/nginx/conf.d/ directory contains a default.conf configuration file which has the settings for a virtual host that will work through http://localhost/
Check the file and it will show the location of web files which is called the root.
location / { root /usr/share/nginx/html; index index.html index.htm; }
So our web file (.html, .php and everything) should be put inside the /usr/share/nginx/html directory.
To create more virtual hosts, simply copy the default.conf file and edit the root path and server_name settings to match that of your domain/host.
$ cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/mysite.conf
Now edit mysite.conf and configure settings like root directory and server_name.
Then test your nginx configuration and restart server. That should create the new virtual host.
File Permissions
When setting up the root directory for the web files, it must be ensured that the files and all parent directories are readable by "group" and "others" on the system. For example a permissions of 0755. Nginx would not be able to read the files, if the parent directories are not readable.
For example if you choose to place you web files in the following directory
/home/joe/public_html
Then ensure that both home and joe directories are readable by group and others. Otherwise even if the web files are readable by others, but not the parent directory joe, then nginx would not be able to read the files and error log would contain messages like this
open() "/home/joe/public_html/index.html" failed (13: Permission denied)
Install PHP and FPM
Now that nginx server is up and running, next task is to install the php interpreter so that .php files can be processed by nginx.
Since php-fpm is already part of the CentOS repository, we don’t need to create another repo entry like the one we did for nginx package. So to install php-fpm, we can just use the yum command.
$ yum install php-fpm
You may want to use the "-C" option if you don't want yum to update repository data before installing the packages.
Now check the php-fpm service status
# service php-fpm status php-fpm is stopped
Then start it
# service php-fpm start Starting php-fpm: [ OK ] [root@dhcppc2 ~]#
Now its time to create a php script and test it. The web files directory is /usr/share/nginx/html
So create a file in that directory.
# nano /usr/share/nginx/html/phpinfo.php
After that we add this content to it.
<?php phpinfo();
Now its time to open the file via our browser.
http://192.168.1.4/phpinfo.php
NO, it won't work yet, since we have not configured nginx to execute php scripts.
Configure Nginx to run php
Nginx already comes with a default configuration to use php fpm. Open the /etc/nginx/conf.d/default.conf file and uncomment the following lines.
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
The SCRIPT_FILENAME is very important and must point to the correct location, otherwise you would keep getting "File not found." error.
Save the file and close it. Now test your new nginx configuration.
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@dhcppc2 ~]#
Configuration is OK. Now restart nginx for new configuration to take effect.
# service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ] [root@dhcppc2 ~]#
Done. Now open the php script in your browser and it should work right away.
http://192.168.1.4/phpinfo.php
Install APC
APC is the alternative php cache that enables php to cache both user data and opcode. This makes php execution faster than usual. The package for APC is available in the base repository itself so we do not need to configure any additional repositories.
Install it using yum right away.
# yum install php-pecl-apc
Now restart php-fpm for apc to get enabled
# service php-fpm restart Stopping php-fpm: [ OK ] Starting php-fpm: [ OK ] [root@analytics php.d]#
The configuration file for apc is located at the following path.
/etc/php.d/apc.ini
The same path is also mentioned in the output of phpinfo() function if you want to verify.
The Configuration section of phpinfo.php page should have a section for apc which shows the values of various apc directives. All those directives can be configured in the apc.ini file.
Notes
1. While configuring virtual hosts, the nginx configuration test might fail with an error like this
# nginx -t nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32 nginx: configuration file /etc/nginx/nginx.conf test failed
To fix this error, open the main nginx configuration file located at /etc/nginx/nginx.conf and add the following line in the http block.
server_names_hash_bucket_size 64;
That will increase the hash bucket size and fix the error.
I installed PHP 5.3.29 (fpm-fcgi) (built: Aug 20 2014 16:42:49). It needed to change /etc/php-fpm.d/www.conf. Edit it and change lines
user = apache
group = apache
to
user = nginx
group = nginx
Thanks
If you have the error ‘No Input file specified’ from php, then move the setting ‘root’ one level higher. Don’t define it in Server – Location, but rather directly below Server
how to add mysql and phpmyadmin with it
I received error 403 until I added index.php to the index setting
index index.html index.htm index.php;
How to add a module to nginx when installed, Example: ngx_http_hls_module
Thanks
modules must be compiled with nginx. they cannot be installed externally.