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:
- Apache Web Server
- nginx
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)
-
Go to your websites home directory:
# cd /var/www/mywebsite.com/public/
-
Create a new file with the nano editor by running the following:
# nano index.php
-
This will bring up the nano editor, type the following in it:
<?php phpinfo(); ?>
Save and exit the file by hitting CTRL+X and entering Y
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
Login or Register to post comments.