2011

JUL

22

Installing and Configuring Nginx Web Server with PHP and MySQL

If you want your cloud server to be provide access to your websites via the Internet, you will need to install a bit of 'web server' software.

There are a few different options available to you in this regard, but the two main web server applications we have used are:

As we run our websites using PHP code and therefore require PHP to dynamically generate pages, our web server will need to have a tie in with PHP software.

In Apache you have a PHP module built-in, which unfortunately loads a new PHP instance to memory with every request, whether the request is for a static file or PHP. This makes it a more memory intensive web server.

With nginx you have a php cgi (common gateway interface) - this delegates the decoding and execution of PHP coded scripts to a seperate process. This keeps the memory footprint of the server low as well as serving up static files whilst using much lower system resources.

We will install nginx along with the PHP-FPM (FastCGI Process Manager). Let's get started.

Install nginx as below:

# sudo apt-get update
# sudo apt-get install nginx

Run it:

# sudo service nginx start

Next, we install PHP, along with various modules - including the FPM module.

# sudo apt-get install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick 
php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-pspell php5-recode 
php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

When done, run the following also:

# sudo aptitude update

# sudo aptitude install php5-fpm

# sudo service php5-fpm start

PHP and PHP-FPM are now also installed. All that is required now to allow you cloud slice to serve webpages is to configure Nginx.

Nginx will be installed as default to run under the user 'www-data'. We need to make sure that the 'www-data' user is within the same user group as the user you access the server under e.g. 'mynewusername':

# sudo usermod -a -G www-data mynewusername

We will store all of our web 'stuff' inside the /var/www folder structure, so we need to change the ownership of that folder (and folders within it) to the 'www-data' user - so that the web server has access to it:

# sudo chown -R www-data:www-data /var/www

Give 775 permissions to the folder (and folders within it) :

# sudo chmod -R 775 /var/www

Now, you need to create your website structure within the /var/www/ folder, so let's assume your website will be 'mywebsite.com'. Create the directory structure for this website, so that you have public and logs folders within it :

# mkdir -p /var/www/mywebsite.com/{public,logs}

Great! We now have a directory created where we can put webpages etc for our website. All we need to do now if create a virtual host file - this file is what links the directory structure to a specific website. By this principle you can have many directory structures and virtual host files and therefore serve many different websites on one cloud server.

Create a virtual host file in the /etc/nginx/sites-available/ folder:

# sudo nano /etc/nginx/sites-available/mywebsite.com

Type the following in this file:


server {
     listen   80;
     server_name mywebsite.com;

     access_log /var/www/mywebsite.com/logs/access.log;
     error_log /var/www/mywebsite.com/logs/error.log;

     location / {
          root   /var/www/mywebsite.com/public/;
          index  index.html index.php index.htm;
          }


        #error_page  404  /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }


        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
                #proxy_pass   http://127.0.0.1;
        #}                                           

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/mywebsite.com/public$fastcgi_script_name;
                include        /etc/nginx/fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one

      # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny  all;
        }


}

The virtalhost configuration above creates a server listening on port 80 at requests for the domain mywebsite.com, saves access attempts to the 'access_log' path, and errors to the 'error_log' path. For all requests from the home directory, it sets the root directory on the file system and explicity states the filename to look for as default, if one isn't supplied.

It is set up to pass all php file requests to the PHP-FPM to handle.

Now to test your nginx server setup, do the following: (i'm going by the virtualhost config above)

You have so far installed nginx, php including the php-fpm module, created a directory structure on your cloud slice for your website domain and it's files, created a nginx virtualhost file and created a test php file in your domain root directory containing a small piece of php code to bring up the full configuration details in your web browser.

To make your virtualhost file active you have to enable it.

You will remember that you created the 'mywebsite.com' virtualhost file in the '/etc/nginx/sites-available/' folder.

To enable it, you need to create a shortcut/symlink for the file to the '/etc/nginx/sites-enabled/' folder.

Anything in that folder will be scanned on every http request.

To create a symlink do the following:

# sudo ln -s /etc/nginx/sites-available/mywebsite.com   /etc/nginx/sites-enabled/mywebsite.com

Then restart the nginx server:

# sudo service nginx restart

If all went well, it should restart without errors.

If you dns is all set up correctly, you can navigate to mywebsite.com on your own computer's web browser and should see the PHP Information Page, showing you the configuration details.

Great! Before we finish, let's quickly install mysql and associated modules.

Run the following:

# sudo apt-get install mysql-server php5-mysql mysql-client

That's it. You can create databases as required below:


# mysql -u root -p
Enter password:   <---- you would enter your login password here

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 162
Server version: 5.1.41-3ubuntu12.6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on testdb.* to 'dbuser1' identified by 'db_user_pw';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye

To complete, restart your PHP-FPM service and your nginx server :

# sudo service php5-fpm restart
# sudo service nginx restart

0 comments

Cloud Server

Tags:mysql, php, apache, nginx

Add Your Opinion

Your Name (leave blank if already registered!):
Your Email Address:
Your Password:
Enter the words (Prevents SPAM):
What is the answer to this simple math question?
Your Comment:

0 comments on: Installing and Configuring Nginx Web Server with PHP and MySQL

©2013 Geeky Coders Limited

Registered in England No. 07718100

Get in touch!

Have you got any questions about our projects?

Maybe you have a project of your own you would like developed?

Whatever your question, get in touch - We can help!

Complete this quick form:

Your name:
Your email:
Your question: