Cấu hình nginx cơ bản - Phần 1

Hiện tại tôi vừa có một quãng thời gian tìm hiểu về nginx. Do cũng chưa làm việc trên các web server khác như apache hay IIS nên tôi chưa có những so sánh đánh giá giữa các loại :D Loạt bài này xem như hướng dẫn từ A-Z cho người mới bắt đầu. Hi vọng bài viết sẽ giúp các bạn đi qua nhanh những trở ngại mà tôi đã gặp.

Các vấn đề sẽ giải quyết

Trong khuôn khổ bài viết này, tôi sẽ đi vào các chủ đề sau.

  • Biên dich cài đặt nginx

  • Tạo init script

  • Tạo một vhost

  • Cấu hình để nginx xử lý php

  • Phân quyền thư mục website

  • Cấu hình basic authention

  • Giới hạn truy cập theo IP

  • Hỗ trợ SSL

  • Biến đổi nginx hỗ trợ load balancing

  • Biến đổi nginx thành caching proxy

  • Xác định nguồn gốc địa lý của http request

Biên dịch và cài đặt nginx

Tính đến thời điểm viết bài này thì nginx đã release ra version 1.8.0 Trong trang download của nginx có hai nhánh: stable và mainline. Mainline là nhánh cho phát triển. Ở đây tôi lựa chọn nhánh stable phù hợp với các sản phẩm chạy trên product server

wget http://nginx.org/download/nginx-1.8.0.tar.gz tar xvzf nginx-1.8.0.tar.gz cd nginx-1.8.0

Chuẩn bị một số package phục vụ cho việc biên dịch nginx: yum install make gcc gcc-c++ pcre-devel zlib-devel openssl-devel

Tiến hành biên dịch: ./configure --with-http_ssl_module \ --with-pcre \ --with-file-aio \ --with-http_stub_status_module \ --with-http_realip_module \ --with-http_gzip_static_module make make install

http_ssl_module hỗ trợ https pcre hỗ trợ regular expression matching file aio hỗ trợ input/output bất đồng bộ realip_module hỗ trợ lấy real ip của origin server nằm đằng sau proxy gzip_static_module hỗ trợ nén data trả về cho những client có hỗ trợ gzip.

Tạo init script

Chuẩn bị một file config: /etc/sysconfig/nginx

# Configuration file for the nginx service.

NGINX=/usr/local/nginx/sbin/nginx
CONFFILE=/usr/local/nginx/conf/nginx.conf

Init script có nội dung như sau:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/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

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

nginx=${NGINX}
prog=$(basename $nginx)
NGINX_CONF_FILE=${CONFFILE}
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
    sleep 1
    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

Sau đó tôi gán quyền execute cho init script chmod u+x /etc/init.d/nginx

Chuẩn bị một user nginx useradd -d /dev/null -c "nginx user" -s /sbin/nologin nginx

Trong trường hợp cài đặt nginx từ các bản pre build trên repository thì tôi đã có sẵn các init script này rồi.

Kết thúc phần cài đặt. Trong loạt bài phần 2 tôi sẽ giới thiệu cách cấu hình vhost và sử dụng php-fpm đễ vhost xử lý được file php.

Last updated