Thứ Sáu, 1 tháng 8, 2014

Cài đặt Nginx + PHP-FPM + MySQL

Chào các bạn
Sau khi tôi giới thiệu làm thế nào để tạo 1 Instance VPS free một năm với Amazon EC2.
Hôm nay tôi viết bài làm thế nào setup một webserver  ( Nginx ) để chạy với PHP ( sử dụng PHP-FPM ) và cơ sở dữ liệu là Mysql.
Mục tiêu: Giúp các bạn hiểu sơ về web server sử dụng Nginx, PHP-FPM . Các bạn có thể setup đơn giản nhất webserver chạy bằng Nginx , PHP-FPM  và Mysql

Tại sao là Nginx không phải là Apache hay là một web server khác ?
Nginx là open source, free , high performance HTTP server , chủ yếu tập trung vào vấn đề xử lý request ở cùng một thời điểm , tối ưu tài nguyên cho hệ thống như RAM, CPU .
Các bạn có thể tham khảo thêm thông tin ở link sau: Thấy tài liệu này cũng khá đủ, giải thích cũng khá chi tiết. Nếu tôi viết lại thì chắc là cũng dịch từ tài liệu bên dưới . He he. Thôi các bạn tự đọc vậy.
http://www.aosabook.org/en/nginx.html

PHP-FPM là gì  ? Tại sao lại chọn nó ?
Để hiểu được PHP-FPM là gì ? Thì trước hết các bạn phải hiểu được cơ chế xử lý của web server.
Vậy làm thế nào webserver chạy được web viết bằng php, python, hay ruby …
Chẳng qua là webserver sẽ gọi những chương trình có thể hiểu được PHP, Python, ruby, xử lý những request và trả về thông tin cho
webserver từ đó trả về thông tin cho browser. Như hình bên dưới:



Vậy CGI là phương pháp giúp web server gọi những chương trình có thể hiểu được ( PHP, Ruby, Python ) để xử lý những request và trả về dữ liệu cho browser.
Mỗi lần gọi CGI Program’s để xử lý thì tạo một process để xử lý. Vậy mỗi request sinh ra 1 process để xử lý. Việc này làm tốn tài nguyên của hệ thống như CPU và RAM, nếu trong trường hợp heavy load đễ gây ra crash hệ thống.
Nên Fast CGI ra đời, với cơ chế  persistent processes ( có thể hiểu là process nó luôn luôn ở chạy ở trạng thái luôn luôn chờ có một request tới để xử lý ) có thể xử lý nhiều request cùng một lúc. Chính vì điều này , tránh khỏi việc mỗi request tạo ra một process để xử lý, nên sử dụng tài nguyên hiệu quả hơn.
Như vậy các bạn đã hiểu rõ sơ về khái nhiệm GCI, Fast CGI. 

Vậy PHP -FPM là gì ?
PHP-FPM (FastCGI Process Manager) là FastCGI với thêm một vài tính năng hỗ trợ khi site heavy load.
Trong danh sách tíng năng thì tính năng này được nói đầu tiên:
advanced process management with graceful stop/start;
Đơn giản nếu bạn dùng fast-cgi thuần tí, thì các bạn thay đổi config thì các bạn phải stop/start lại fast-cgi, như vậy thì site sẽ down một vài phút.
Còn với php-fpm thì các bạn có thể thay đổi config và reload lại, không làm site bị down.
Tính năng khác thêm vào các bạn có thể tham khảo ở đây:
http://www.php.net/manual/en/install.fpm.php

Vậy là các bạn hiểu được sơ sơ về các khái niệm.

Bây h vào mục chính là
Cài đặt Nginx + PHP-FPM + MySQL
Nếu bạn sử dụng EC2 thì trước khi cài đặt bạn chỉnh thời gian, và một số gói cần thiết :
sudo ln -sf /usr/share/zoneinfo/Asia/Saigon /etc/localtime
sudo yum install pcre-devel zlib-devel openssl-devel
sudo yum install gcc
sudo yum install make

Install Nginx và PHP-FPM

wget http://nginx.org/download/nginx-1.4.7.tar.gz 
tar fx nginx-1.4.7.tar.gz
cd nginx-1.4.7
./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --with-http_stub_status_module
make && make install
sudo yum install -y php-fpm

Install PHP extensions

sudo yum install -y php-devel php-mysql php-pdo \
      php-pear php-mbstring php-cli php-odbc \
      php-imap php-gd php-xml php-soap

 Install PHP-APC

sudo yum install -y php-pecl-apc
sudo yum install -y pcre-devel

Install MySQL

sudo yum -y install mysql-server mysql

 Nginx Configuration

Tao user Nginx:
sudo adduser --system --no-create-home --user-group -s /sbin/nologin nginx
Bạn tạo vhost directory. Việc này giúp bạn dễ quản lý hơn nếu sau này trên VPS các bạn có thể quản lý nhiều website khác nhau.
Thư mục sites-available là lưu tất cả các config của từng Vhost khác nhau:
Ví dụ bạn có 5 website cùng host trên một server, thì bạn có 5 file đặt trong thư mục này.
Nếu site nào bạn muốn bật lên thì chỉ việc tạo softlink vào thư mục sites-enabled mà thôi.
mkdir  /usr/local/nginx/sites-available
mkdir  /usr/local/nginx/sites-enabled
Thêm dòng include thư mục sites-enabled vào config chính  của nginx.
sudo vi /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/sites-enabled/*;
Ví dụ, tôi tạo một Vhost là mysite để config cho trang web mysite.com chẳng hạn. Tạo virtual host mysite file trong thư mục /usr/local/nginx/sites-available
Trước mắt tôi tạo những thư mục sau:
public_html: thư mục web của bạn
logs: thư mục log, thì có access log, error log.
mkdir -p /srv/www/mysite/public_html 
mkdir -p /srv/www/mysite/logs 
chown -R nginx:nginx /srv/www/mysite
sudo vi /usr/local/nginx/sites-available/mysite

server {
server_name mysite.com;
access_log /srv/www/mysite/logs/access.log;
error_log /srv/www/mysite/logs/error.log;
root /srv/www/mysite/public_html;

location / {
index index.html index.htm index.php;
}

location ~ \.php$ {
try_files $uri =404;
# Include the standard fastcgi_params file included with nginx
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}
}
Tạo soft link những Vhost nào enable. Như trong phần này tôi enable vhost mysite
ln -s /usr/local/nginx/sites-available/mysite /usr/local/nginx/sites-enabled/mysite

Tạo script restart Nginx:

sudo vi /etc/init.d/nginx
Copy và Paste:
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
configtest || return $?
stop
start
}

reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}

force_reload() {
restart
}

configtest() {
$nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
status $prog
}

rh_status_q() {
rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
sudo chmod +x /etc/init.d/nginx
sudo /etc/init.d/nginx start

 PHP-FPM Configuration
sudo vi /etc/php-fpm.d/www.conf
[...]
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0664

user = nginx
group = nginx
[...]
sudo vi /etc/php.ini
cgi.fix_pathinfo=0
Auto Start Nginx, PHP-FPM, and MySQL in EC2 Amazon Linux
chkconfig nginx on
chkconfig mysqld on
chkconfig php-fpm on

 Kiểm tra cấu hình Nginx and FastCGI:

Tạo file index.php
(/srv/www/mysite/public_html/index.php):
<?php phpinfo(); ?>
Vào browser và gõ địa chỉ IP và xem kết quả.
Chúc bạn thành công

Không có nhận xét nào:

Đăng nhận xét

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...