首页 > 代码库 > Nginx + PHP-FPM + MySQL + phpMyAdmin on Ubuntu (aliyun)
Nginx + PHP-FPM + MySQL + phpMyAdmin on Ubuntu (aliyun)
今天抽空在阿里云上部署安装了PHP的环境
主要有nginx, php5 php-fpm mysql phpmyadmin
本文来源于:http://www.lonelycoder.be/nginx-php-fpm-mysql-phpmyadmin-on-ubuntu-12-04/
Since 3 years I’m completely into Nginx. For some reason I was always struggling with Apache, and that kept me from running my own server. But then a colleague told me about Nginx, and how great it was. So I looked into it, and the things I read were great. Compared to Apache, Nginx is smaller in size, it multiplies the performance remarkably by recducing the RAM and CPU usage for real time applications and it’s very flexible. Of course Apache will also have its advantages, but the fact I can’t come up with one says enough (about me, or Apache ;-)).
So today I’m going to show you how to setup Nginx with PHP 5 and MySQL on Ubuntu 12.04. It’s really not that difficult. Let’s start with Nginx.
1 | sudo apt-get install nginx -y |
That’s it. But now we want to configure Nginx. I normally use Sublime Text 2 as a text editor, because VI hates me (or I hate VI, really hard to tell). But on a remote server sublime is not really an option, so I will just use nano. Feel free to use the editor you prefer.
You can download the config here.
1 2 3 | cd /etc/nginx sudo cp nginx.conf nginx.conf.backup sudo nano nginx.conf |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | user www-data; # As a thumb rule: One per CPU. If you are serving a large amount # of static files, which requires blocking disk reads, you may want # to increase this from the number of cpu_cores available on your # system. # # The maximum number of connections for Nginx is calculated by: # max_clients = worker_processes * worker_connections worker_processes 1; # Maximum file descriptors that can be opened per process # This should be > worker_connections worker_rlimit_nofile 8192; events { # When you need > 8000 * cpu_cores connections, you start optimizing # your OS, and this is probably the point at where you hire people # who are smarter than you, this is *a lot* of requests. worker_connections 8000; } error_log /var/log/nginx/error .log; pid /var/run/nginx .pid; http { charset utf-8; # Set the mime-types via the mime.types external file include mime.types; # And the fallback mime-type default_type application /octet-stream ; # Click tracking! access_log /var/log/nginx/access .log; # Hide nginx version server_tokens off; # ~2 seconds is often enough for HTML/CSS, but connections in # Nginx are cheap, so generally it‘s safe to increase it keepalive_timeout 20; # You usually want to serve static files with Nginx sendfile on; tcp_nopush on; # off may be better for Comet/long-poll stuff tcp_nodelay off; # on may be better for Comet/long-poll stuff server_name_in_redirect off; types_hash_max_size 2048; gzip on; gzip_http_version 1.0; gzip_comp_level 5; gzip_min_length 512; gzip_buffers 4 8k; gzip_proxied any; gzip_types # text/html is always compressed by HttpGzipModule text /css text /plain text /x-component application /javascript application /json application /xml application /xhtml +xml application /x-font-ttf application /x-font-opentype application /vnd .ms-fontobject image /svg +xml image /x-icon ; # This should be turned on if you are going to have pre-compressed copies (.gz) of # static files available. If not it should be left off as it will cause extra I/O # for the check. It would be better to enable this in a location {} block for # a specific directory: # gzip_static on; gzip_disable "msie6" ; gzip_vary on; include /etc/nginx/conf .d/*.conf; include /etc/nginx/sites-enabled/ *; } |
Change the default site config. You can download the config here.
1 2 | sudo cp sites-available /default sites-available /default .backup sudo nano sites-available /default |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | server { listen 80 default; ## listen for ipv4; this line is default and implied listen [::]:80 default ipv6only=on; ## listen for ipv6 # Make site accessible from http://localhost/ or server IP-address server_name localhost; server_name_in_redirect off; charset utf-8; access_log /usr/share/nginx/access .log; error_log /usr/share/nginx/error .log; root /usr/share/nginx/www ; index index.php index.html index.htm; location / { # First attempt to serve request as file, then # as directory, then trigger 404 try_files $uri $uri/ =404; } } |
Now we need to reload Nginx.
1 | sudo service nginx reload |
Try http://localhost/ (or http://your-server-ip-address) and hopefully you will see the welcome page of Nginx. Nice! Next, MySQL. Just follow the on screen instructions.
1 | sudo apt-get install mysql-server mysql-client -y |
To have a secure installation, we execute the following command:
1 | sudo mysql_secure_installation |
Follow the instructions. Start by entering your MySQL root password. If you did not set one yet, do it! It’s just that easy. So we can continue with PHP.
1 | sudo apt-get install php5-fpm php5-cli php5-mysql -y |
If you don’t want to run PHP from console, you can skip php5-cli. If you are planning to use the Symfony2 framework I would suggest you keep it, you will need it. By default fpm and cli use their own php.ini configuration file. I usualy want them to use the same one. If you want that too, do the following:
1 2 3 | cd /etc/php5/cli sudo mv php.ini php.ini.backup sudo ln -s .. /fpm/php .ini |
Once php-fpm is installed, we need to configure Nginx again.
1 2 | cd /etc/nginx sudo nano nginx.conf |
Add the following to the http {} part.
1 2 3 4 | # Upstream to abstract back-end connection(s) for PHP upstream php { server unix: /tmp/php5-fpm .sock; } |
Prepare the default site so it can serve PHP pages (needs to be in the server {} part).
1 | sudo nano /etc/nginx/sites-available/default |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | # pass the PHP scripts to FPM socket location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini fastcgi_pass php; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www $fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /usr/share/nginx/www ; # send bad requests to 404 fastcgi_intercept_errors on; include fastcgi_params; } |
Open /etc/php5/fpm/pool.d/www.conf and look for the following line ..
1 2 | cd /etc/php5/fpm/pool .d sudo nano www.conf |
1 | listen = 127.0.0.1:9000 |
.. and change it into ..
1 | listen = /tmp/php5-fpm .sock |
Save and restart both Nginx and PHP-FPM.
1 2 | sudo service nginx restart sudo service php5-fpm restart |
Create a PHP file in your web root.
1 | nano /usr/share/nginx/www/index .php |
1 2 3 4 5 | <?php phpinfo(); ?> |
Save the file and refresh http://localhost/ (or http://your-server-ip-address). If everything goes well you have a nice page with your PHP configuration explained, if not you can replace “/tmp/php5-fpm.sock” by “/var/run/php5-fpm.sock” in both /etc/nginx/nginx.conf and /etc/php5/fpm/pool.d/www.conf and reload nginx and php5-fpm (possible solution by Flávio Moringa, thnx Flávio!).
The final thing to do is install phpMyAdmin.
1 | sudo apt-get install phpmyadmin -y |
Go to your web root and link phpMyAdmin.
1 2 | cd /usr/share/nginx/www sudo ln -s /usr/share/phpmyadmin |
Now you should be able to go to http://localhost/phpmyadmin (or http://your-server-ip-address/phpmyadmin). In a production environment I try not to use phpMyAdmin, and if I really need it I use another alias. For example poiul. It makes it harder for others to find it.