NGINX cơ bản

NGINX thì quá quen thuộc với các anh em quản trị web server rồi. Nhưng đối với những bạn đã nghe đến nhưng chưa làm thì chắc hẵn chưa biết config nó ra sao. Nếu vậy các bạn thử bài LAB này xem sao:

1. Phân tích:

NGINX thì quá quen thuộc với các anh em quản trị web server rồi.

+ Khi một client browse đến webserver thì NGINX sẽ xử lý đầu tiên. Nếu như có cấu hình Reverse-proxy trên NGINX, thì sẽ gửi tín hiệu GET cho Memcached, hỏi thử xem trong Memcached có lưu sẵn dữ liệu không. Nếu có thì sẽ trả ngay về cho NGINX xứ lý và respond tức thời cho client.
+ Nếu như không cấu hình Reverse-proxy hoặc trong Memcached không có cache lại dữ liệu, thì lúc này NGINX sẽ gửi tín hiệu GET xuống cho các module PHP - MySQL xử lý biên dịch bằng fast-fcgi. Một phần sẽ cache lại dữ liệu đưa vào Memcached để Memcached sử dụng cho lần sau (Nếu có cấu hình Reverse-proxy).
Đặt vấn đề:
+ NGINX và APACHE cùng chạy 1 lúc vậy phải làm sao?
-->NGINX là chính nên sẽ cho chạy port 80. APACHE chạy Back-END sẽ cho chạy 1 port khác.
+ Có cả Fast-fcgi và PHP-cgi cùng hoạt động, vậy có xung đột không? Webserver biết xài cái nào?
-->Fast-fcgi là 1 “trình biên dịch” tích hợp sẵn với NGINX trong phiên bản mới nhất. (Fast-fcgi cũng là 1 trình biên dịch của lighttpd). PHP-cgi là “trình biên dịch” tích hợp sẵn với APACHE. Để NGINX xử lý tốt thì Fast-cgi cần phải hoạt động. Như vậy cần phải có thêm 1 “module” nữa để giúp NGINX hoạt động tốt với fast-cgi: spawn-fcgi. Lưu ý rằng apache sẽ được stop.
+ Tại sao không sử dụng NGINX làm 1 webserver chính, khỏi cần dùng APACHE???
-->Chưa biết.
+ Dữ liệu khi mà được lưu vào Memcached có chiếm nhiều dung lượng đĩa cứng không? Dữ liệu đó là gì?
-->Hehe. Cũng chưa rõ.
+ Khi trên server có nhiều share hosting, vậy NGINX có hỗ trợ không?
-->Có thể cấu hình Virtual Host trên NGINX.

2. Chuẩn bị:

+ Trong bài LAB này, mình sẽ cấu hình NGINX để chạy 1 website có tên là: www.linuxexample.co.cc. Site này là 1 Virtual Host nằm trên VPS mang địa chỉ IP: 210.211.108.136.
+ Lưu ý: Chưa cấu hình Reverse-proxy chạy Memcached. Chỉ cấu hình để dịch các file PHP bằng Fast-cgi. Trong bài tiếp theo sẽ trình bày về R-Proxy và Memcached.
+ Yêu cầu:
• 1 Fresh VPS đã cài LAMP ( trong điều kiện khác các bạn có thể sử dụng Centos trên local để test cũng được – bằng cách config lại file /etc/host)
• 1 Domain free trỏ về VPS.

3. Cấu hình:

Bước 1: Tạo 1 Virtual Host:
+ Có thể chỉnh sửa file httpd.conf hoặc dùng Virtualmin. Ở đây mình sử dụng Virtualmin cho tiện:

Image has been scaled down 6% (1215x760). Click this bar to view original image (1280x800). Click image to open in new window.


Hình 1: Tạo virtual host bằng Virtualmin
Virtual Host Linuxexample đã được tạo, nằm trong thư mục /home/linuxexample.

Bước 2: Cài các thành phần phụ thuộc: gồm 4 gói:
+ Gói PCRE: Hình dưới mình đã cài rồi. Các bạn yum bình thường.
http://cc9.upanh.com/23.470.30526848.pEx0/h3.jpg
Hình: Yum gói PCRE
+ Gói gcc lib dùng để biên dịch khi cài NGINX: Yum install gcc
+ Gói mod_rpaf-0.6-2.el5.art.i386.rpm các bạn tìm hiểu thêm gói này là gì?

Bước 3: Cài NGINX:
+ Tải gòi NGINX: wget http://nginx.org/download/nginx-1.0.4.tar.gz
+ Tiếp theo ta giải nén file nginx-1.0.4.tar.gz:

+ Bắt đầu lựa chọn các module cần thiết để Build. Chúng ta sẽ chỉ dẫn ra NGINX được install ở thư mục nào và module nào được build cùng với NGINX bằng cú pháp tại trang: http://wiki.nginx.org/InstallOptions

+ Mình sẽ build với các tham số:

[root@sang nginx-1.0.4]#./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
Lưu ý: Nếu các bạn không chỉ rõ đường dẫn thì mặc định là /usr/local
Chú ý các đường in đậm.

Hình: sau khi ./configure xong
[root@sang nginx-1.0.4]#make
[root@sang nginx-1.0.4]#make install

Bước 4: Cấu hình để start NGINX:
+ Không như các chương trình khác. Với NGINX mình phải tạo ra 1 script để start hoặc sử dụng đường dẫn sau để start: /var/run/nginx/nginx.pid
+ Để tạo 1 script start nginx: vi /etc/init.d/nginx
Sau đó copy đoạn script này rồi save lại:

#!/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/nginx/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

Chú ý: Đọc kỹ các đường dẫn và thay thế cho tương ứng với các đường dẫn cài nginx của các bạn.
+ chmod +x /etc/init.d/nginx

Bước 5: CHANGE PORT
+ Lúc bấy giờ, apache đang đứng canh cái port 80. Nếu bạn start nginx sẽ báo lỗi.

Image has been scaled down 6% (1215x760). Click this bar to view original image (1280x800). Click image to open in new window.

Hình: APACHE port 80

Vì vậy, ta cần change apache qua 1 port khác: 8080 ( Như đã nói trong phân tích)

+ Bạn thử start nginx lên xem sao?

+ Bạn sẽ nhận được thông báo lỗi như hình trên. Để khắc phục bạn chỉ cần tắt APACHE đi.

Bước 6: Như vậy đã start được NGINX rồi, nhiệm vụ tiếp theo là làm sao ta có thể chạy được Virtual Host : linuxexample.co.cc ???
+ Nhớ lại lúc ta ./configure. Mình có in đậm vài đường. Bây giờ ta sẽ nghiên cứu các đường đó.
/etc/nginx/nginx.conf : chứa file cấu hình chính (main conf)
/var/log/nginx/error.log: ghi nhận lỗi

+ Mở file vi /etc/nginx/nginx.conf: Ở đây mình ko giải thích nhiều vì nó quá nhiều thứ và quá mất thời gian. Tùy theo kinh nghiệm cá nhân mà config. Mình sẽ trình bày mẫu một file mà mình lấy trên site http://www.nginx.org và đã config lại như sau:

user nobody;
worker_processes 5;

error_log /var/log/nginx/error.log;
pid /var/run/nginx/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log /var/log/nginx/access.log;
server_names_hash_bucket_size 128;
sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 2;
tcp_nodelay on;

gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml;
gzip_disable "MSIE [1-6]\.";

limit_req_zone $binary_remote_addr zone=antiddos:20m rate=3r/s;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;// Đây sẽ là file liên kết các Virtual Host
include /etc/nginx/fastcgi.conf; // Start fast-fcgi biên dịch php
}

+ Tiếp theo là tạo thư mục chứa file liên kết đến Virtual Host: vi /etc/nginx/sites-enabled
+ Trong thư mục này, nếu các bạn muốn chạy site nào thì tạo 1 file tương ứng cho site đó. Ở đây mình tạo file: vi /etc/nginx/sites-enabled/linuxexample.co.cc
+ Với nội dung như sau:
server {
listen 80;
#server_name 210.211.108.136; Ko cần cũng được

access_log off;

location / {
root /home/linuxexample/public_html/;
index index.php index.html index.htm;

# to forward www to non-www address
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
}
location ~ (^/$|^/index.php) {
limit_req zone=antiddos burst=5 nodelay;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/linuxexample/public_html/$fastcgi_script_name;
fastcgi_read_timeout 180;
include fastcgi_params;
}
}

+ chmod 0755 /home/linuxexample/public_html để không bị báo lỗi Fobidden.

2011/06/09 1753 [error] 7255#0: *7 "/home/linuxexample/public_html/index.php" is forbidden (13: Permission denied), client: 58.186.209.167, server: linuxexample.co.cc, request: "GET / HTTP/1.1", host: "linuxexample.co.cc"

4. Kiểm tra:

+ Trường hợp chưa cài spawn-fcgi:
- Các bạn tạo thử 1 file index.html trong thư mục public_html. Khi chạy sẽ OK.
- Các bạn tạo thử 1 file index.php trong thư mục public_html. Khi chạy sẽ báo lỗi 502 bad gateway.
- Các bạn xem log như sau:
- 2011/06/09 21:01:48 [error] 12674#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 58.186.209.167, server: linuxexample.co.cc, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "linuxexample.co.cc"
- Chứng tỏ khi client request thì fast-fcgi không biên dịch được để trả về cho NGINX. Nên báo lỗi refuse.

+ Trường hợp cài spawn-fcgi để chạy fast-fcgi:
- Sẽ không còn báo lỗi.

Image has been scaled down 6% (1215x760). Click this bar to view original image (1280x800). Click image to open in new window.

 

Kết luận:

+ Để xong phần proxy rùi tính sau
+ Bài viết còn nhiều sai sót nên chỉ có tính chất đóng góp.