Chủ Nhật, 10 tháng 4, 2016

[Centos][Load Balance][Failover] Setup Keepalive

Hướng dẫn cài đặt Keepalive

I.References

Kịch bản Network:
  1. LB1 Server: 192.168.10.111 ( eth1 )
  2. LB2 Server: 192.168.10.112 ( eth1 )
  3. Virtual IP: 192.168.10.121
Bây giờ ta sẽ cài đặt IP Failover giữa 2 LB như sơ đồ dưới:

keepalived-vrrp-network

Thực hiện cài đặt Keepalive lên cả 2 server LB theo hướng dẫn cài đặt sau.

1. Hướng dẫn cài đặt với Yum

Lưu ý: cài đặt keepalive cần sử dụng quyền root

a. Cài đặt các gói yêu cầu
# yum install gcc kernel-headers kernel-devel
b.Cài đặt Keepalive
# yum install keepalived

2.Cầu hình Keepalive

Cấu hình: vi /etc/keepalived/keepalived.conf
Thay đổi các tham số được highligt tương ứng với hệ thống của bạn

a. Cấu hình trên LB1
! Configuration File for keepalived

global_defs {
   notification_email {
     sysadmin@mydomain.com
     support@mydomain.com
   }
   notification_email_from lb1@mydomain.com
   smtp_server localhost
   smtp_connect_timeout 30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.121
    }
}
b.Cấu hình trên LB2
! Configuration File for keepalived

global_defs {
   notification_email {
     sysadmin@mydomain.com
     support@mydomain.com
   }
   notification_email_from lb2@mydomain.com
   smtp_server localhost
   smtp_connect_timeout 30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.121
    }
}
c.Note:
  • interface : tên của card physical network sẽ gắn VRIP, sử dụng command ip a
2: eth1:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:6f:ed:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.111/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::20c:29ff:fe6f:ed60/64 scope link
       valid_lft forever preferred_lft forever
 Trong ví dụ trên gắn vào card private, có name eth1.
  • Edit Keepalived configuration file on LB2 and add following configuration. While making changes in LB2 configuration file, make sure to set priority values to lower than LB1. For example below configuration is showing 100 priority value than LB1 has it 101..
  •  Priority value will be higher on Master server, It doesn’t matter what you used in state. If your state is MASTER but your priority is lower than the router with BACKUP, you will lose the MASTER state.
  • virtual_router_id should be same on both LB1 and LB2 servers.
  • By default single vrrp_instance support up to 20 virtual_ipaddress. In order to add more addresses you need to add more vrrp_instance

3.Các lệnh Keepalive

a.Start Keepalive
# service keepalived start
# chkconfig keepalived on

b.Check Virtual IPs
Mặc định virutla IP sẽ được gán cho master server, trong trường hợp master down, nó sẽ tự động được assign cho slave server.Sử dụng command sau đây để xem việc gán virtual ip trên interface.
# ip addr show eth1
Ví dụ kết quả hiển thị như dưới:
2: eth1:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:6f:ed:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.111/24 brd 192.168.1.255 scope global eth1
    inet 192.168.10.121/32 scope global eth1
    inet6 fe80::20c:29ff:fe6f:ed60/64 scope link
       valid_lft forever preferred_lft forever

c.Verify IP failover

  • Shutdown LB1, IP tự động được gán sang server slave
# ip addr show eth1
  • Start LB1, và stop slave server (LB2), IP sẽ được gán cho server master
# ip addr show eth1
  • Xem log 
# tailf /var/log/messages
Ex,kết quả show log
Mar 19 17:30:24 localhost Keepalived_vrrp[6958]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 19 17:30:25 localhost Keepalived_vrrp[6958]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 19 17:30:25 localhost Keepalived_vrrp[6958]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 19 17:30:25 localhost Keepalived_healthcheckers[6957]: Netlink reflector reports IP 192.168.10.121 added
Mar 19 17:30:25 localhost avahi-daemon[1407]: Registering new address record for 192.168.10.121 on eth1.IPv4.
Mar 19 17:30:25 localhost Keepalived_vrrp[6958]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 

III.Note

1.Verify IP Failover không hoạt động

>resovled: enable IP forwarding và add iptable 2 rule sau:
https://docs.oracle.com/cd/E37670_01/E41138/html/section_ksr_psb_nr.html
 # echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
 # sysctl -p
  net.ipv4.ip_forward = 1
# iptables -I INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# service iptables save
Trong đó: eth0 - card network đang virtual ip

2.Veriry IP Failover khi các tiến trình HA bị chậm treo hoặc die [4]

Trong cấu hình trên keepalive mặc định sẽ check trạng thái của server, nói cách khác keepalive chỉ chuyển IP virtual khi server die mà không check trạng thái của các tiến trình HA như HA Proxy hoặc Nginx load balancing.
Nếu muốn check trạng thái của các tiến trình HA cần phải bổ sung đoạn script check status sau:
vi /etc/keepalived/keepalived.conf
Bổ sung script check status tiến trình:

! Configuration File for keepalived
vrrp_script chk_web {
        script "killall -0 /usr/sbin/haproxy"
        interval 1
        weight 2
}

global_defs {
   notification_email {
     sysadmin@mydomain.com
     support@mydomain.com
   }
   notification_email_from lb1@mydomain.com
   smtp_server localhost
   smtp_connect_timeout 30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.121
    }   
    track_script {
        chk_web
    }
}
  • Script check trạng thái running của haproxy
vrrp_script chk_web {
    script "killall -0 /usr/sbin/haproxy"
    interval 1
    weight 2
}
  • Script check trạng thái running của nginx
vrrp_script chk_web {
    script "killall -0  nginx"
   interval 1
   weight 2
}
  • Thêm đoạn track_script trong block vrrp_instance , trong đó chk_web là tên của vrrp_script
    track_script {
        chk_web    }

Thứ Sáu, 8 tháng 4, 2016

[Nginx] Install Nginx

Hướng dẫn cài đặt Nginx

I.Libraries

yum -y install zlib-devel
yum -y install openssl-devel
yum -y install httpd-devel

II.Setup

1.Cài đặt nginx và các module

tar -xzvf pcre-8.36.tar.gz 
cd pcre-8.36
./configure --enable-utf8 --enable-unicode-properties --prefix=/u01/apps/env/pcre-8.36
make -j8

make install -j8
cd ..
tar -xzvf zlib-1.2.8.tar.gz 
tar -xzvf ngx_pagespeed-1.9.32.3-beta.tar.gz
cd ngx_pagespeed-1.9.32.3-beta
tar -xzvf ../1.9.32.3.tar.gz
cd ..
tar -xzf modsecurity-2.8.0.tar.gz
cd modsecurity-2.8.0
make -j8
cd ..
tar -xzf headers-more-nginx-module-0.25.tar.gz
tar -xzf nginx-1.7.10.tar.gz   
cd nginx-1.7.10
./configure --prefix=/u01/apps/env/nginx-1.9.7 --without-mail_pop3_module --without-mail_imap_module  --without-mail_smtp_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-pcre=../pcre-8.36 --with-zlib=../zlib-1.2.8 --add-module=../modsecurity-2.9.0/nginx/modsecurity --add-module=../ngx_pagespeed-1.9.32.2-beta --add-module=../headers-more-nginx-module-0.28 --with-ipv6 --with-openssl=../openssl-1.0.2g
make -j8
make install -j8
cd ..
cp modsecurity-2.8.0/modsecurity.conf-recommended /u01/applications/nginx-1.7.10/conf/modsecurity.conf
cp modsecurity-2.8.0/unicode.mapping  /u01/applications/nginx-1.7.10/conf

2.Chạy server

/u01/applications/nginx-1.7.10/sbin/nginx

3.Cấu hình nginx

Tham khảo các file cấu hình theo các link tại đây:

#nginx.conf
user
worker_processes
#vt-common.conf
fastcgi_pass
#vt-rewrite-url.conf: sửa các rewrite cần thiết
#sites-available\8086-web01.conf: file cần sửa với mỗi web app
#sites-available\18087-monitor-phpfpm.conf, sites-available\18088-monitor-nginx.conf: dùng để debug

##Reload config
/u01/applications/nginx-1.7.10/sbin/nginx –s reload

#Chú ý (note):
- chỉ quyền root mới mở được cổng 80 hay 443 (only root can run web server with port 80 or 443)
- telnet kiểm tra xem firewall đã mở chưa sau khi cấu hình (telnet to check and open firewall after config)
- cấu hình theo hướng dẫn ở link sau (config nginx to prevent this error http://kaiwangchen.com/blog/2012/10/understand-the-cgi-fix_pathinfo-security-issue/)

4.Command
cd vào thư mục cài đặt nginx.
  • Start: sbin/nginx
  • Stop: sbin/nginx -s stop
  • Reload: sbin/nginx -s reload
II. Note: 
1.erroryou need a c++ compiler for c++ support
resolved: cần cài đặt lib gcc-c++
yum -y install  gcc-c++ 
2.error: ./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
>resolved: pass đường dẫn bộ cài của openssl
  --with-openssl=/u01/apps/setup/openssl-1.0.2g
3.error: start nginx
[operamini@localhost nginx-1.9.7]$ sbin/nginx
sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
>resolved: 
  • Tìm file libpcre.so.1
$find / -name libpcre.so.1
/u01/apps/env/pcre-8.36/lib/libpcre.so.1
  • Set LD_LIBRARY_PATH
$export LD_LIBRARY_PATH=/u01/apps/env/pcre-8.36/lib:$LD_LIBRARY_PATH

Thứ Năm, 7 tháng 4, 2016

[nginx][config] danh sách các cấu hình thông dụng của Ngnix

Cấu hình nginx (conf)



Trong đó:
  • sites_available: chứa danh sách các file cấu hình cho từng ứng dụng.
  • nginx.conf : file cấu hình.
  • nginx-attt.conf: cấu hình các tham số an toàn thông tin.
  • nginx-common.conf: cấu hình các tham số chung cho toàn hệ thống.

1.nginx.conf:

#user  nobody;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
events {
    worker_connections  1024;
    multi_accept        on;
    use                 epoll;
}

http {
    include       mime.types;
    include       nginx-attt.conf;
    include       nginx-common.conf;
    default_type  application/octet-stream;
#    include vt-attt.conf;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    #keepalive_timeout  65;

    gzip  on;
    gzip_vary on;
    gzip_min_length 10240;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";
    open_file_cache          max=2000 inactive=20s;
    open_file_cache_valid    60s;
    open_file_cache_min_uses 5;
    open_file_cache_errors   off;

    #add_header X-Server node7;
    include sites-available/*;
}
#config load balance and https
#--------------------------------------------------------------------------------------------------------------------------
upstream  cms  {
  ip_hash;
  server 10.10.56.12:8610;
  server 10.10.56.13:8610;
}
server {
   listen               443;
   server_name 10.10.56.14;
   ssl on;
   ssl_certificate /path/to/ssl/self-ssl.crt;
   ssl_certificate_key /path/to/ssl/self-ssl.key;

    if ($remote_addr = 125.235.40.59) {
        return 404;
    }


   if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
   }

#   location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
#       root /var/www/html/www/web;
#       expires      30d;
#   }

   location / {
        proxy_pass http://cms;
        proxy_set_header X-Real-IP $remote_addr;
        include proxy_params;
        proxy_connect_timeout 3600;
        proxy_send_timeout 3600;
   }
   include vt-common.conf;

 }
#--------------------------------------------------------------------------------------------------------------------------

2.nginx-attt.conf

# ATTT 
server_tokens off;
# kiem soat bo nho dem (tranh tan cong tran bo nho) 
## Start: Size Limits & Buffer Overflows ##
  client_body_buffer_size  1K;
  client_header_buffer_size 1k;
  client_max_body_size 1k;
  large_client_header_buffers 8 16k;
## END: Size Limits & Buffer Overflows ##
## Start: Timeouts ##
  client_body_timeout   10;
  client_header_timeout 10;
  keepalive_timeout     5 5;
  send_timeout          10;
## End: Timeouts ##

### KIEM SOAT KET NOI DONG THOI 
### Directive describes the zone, in which the session states are stored i.e. store in slimits. ###
### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###
#       limit_conn_zone slimits $binary_remote_addr 5m;
### Control maximum number of simultaneous connections for one session i.e. ###
### restricts the amount of connections from a single ip address ###
#        limit_conn slimits 5;

3.nginx-common.conf

# GIOI HAN PHUONG THUC
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 404;
}

location ~ /\.ht {
deny  all;
}

    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
    fastcgi_busy_buffers_size 32k;

#######################################

4.sites-available/<port>-<app-name>.conf

sites-available/80-app-cms.conf
server {
  listen 80; 

  root /u02/app/cms/web;
  index index.php;

  access_log /u02/app/env/nginx-1.9.7/logs/app_80.access.log main;
  error_log /u02/app/env/nginx-1.9.7/logs/app_80.error.log;

  client_max_body_size 200M;

  location / {
    try_files $uri $uri/ /index.php$uri?$args;
  }

  location ~ "^(.+\.php)($|/)" {
    fastcgi_split_path_info ^(.+\.php)(.*)$;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;

fastcgi_pass   127.0.0.1:9000;
include        fastcgi_params;
fastcgi_read_timeout 300;
  }

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf)$ {    
expires 1d;
access_log off;
  }
}

5.proxy_params
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 0;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;

proxy_read_timeout 300;


[php] install php

Hướng dẫn cài đặt PHP

I.Libraries

  1. http://php.net/downloads.php
  2. libmcrypt-2.5.8-9.el6.x86_64.rpm
  3. libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
II.Setup
1. Cài đặt các thư viện cần thiết
##Cài các thư viện cần thiết
rpm -ivh libmcrypt-2.5.8-9.el6.x86_64.rpm
rpm -ivh libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
yum -y install libxml2-devel
yum -y install libcurl-devel
yum -y install libjpeg-devel
yum -y install libpng-devel
yum -y install freetype-devel

2.Cài đặt PHP
  • tar -xzvf php-5.6.20.tar.xz 
  • cd php-5.6.20
  • ./configure --prefix=/u01/applications/php-5.6.6 --enable-calendar --enable-soap --with-curl --with-gd --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-zlib-dir=/usr/lib --with-freetype-dir=/usr/include/freetype2/ --enable-exif --enable-zip --enable-mbstring --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mcrypt=/usr/local/lib/libmcrypt --enable-fpm --enable-fileinfo --with-openssl
Example./configure  --prefix=/u01/apps/env/php-5.6.20 --with-openssl=/u01/operamini/env/openssl-1.0.2g --with-mysql=shared,/usr --with-mysqli=shared,/usr/lib64/mysql/mysql_config --with-pdo-mysql=shared --enable-calendar --enable-soap --with-curl --with-gd --with-jpeg-dir=/usr --with-png --with-zlib --with-freetype-dir=/usr --enable-exif --enable-zip --enable-mbstring --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mcrypt=/usr/local/lib/libmcrypt --enable-fpm --enable-fileinfo
  • make -j8
  • make install -j8
  • cp php.ini-production /u01/applications/php-5.6.6/lib/php.ini

#Cấu hình: sử dụng file cấu hình mẫu và chú ý các thông số sau
#php.ini
memory_limit
post_max_size
upload_max_filesize
zend_extension (phải thêm vào file mặc định không có)
date.timezone
opcache.* (các cấu hình opcache phải thêm vào file mặc định không có)
#php-fpm.conf
user
group
pm.max_children
pm.status_path

##Chạy PHP-FPM
/u01/applications/php-5.6.6/sbin/php-fpm

#Sau khi cài đặt thêm PHP vào biến mối trường:
vi ~/.bash_profile
#thêm đoạn sau
##----------------------------------------------------
PHP_HOME="/u01/applications/php-5.6.6"
export PATH=$PHP_HOME/bin:$PATH
#----------------------------------------------------


3. Install OCI8
3.1 Thư viện


  1. https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html - oracle client for linux
  2. https://pecl.php.net/package/oci8 - pecl oci 8


3.2 Cài đặt
1. Cài oracle client


rpm -Uvh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
rpm -Uvh oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

2. Cài đặt oci8
Lưu ý: phải cấu hình môi trường php vào file .bash_profile như ở bước cài đặt PHP trên


tar -xzvf oci8-2.1.8.tgz
cd oci8-2.1.8
phpize
./configure --with-oci8=instantclient,/usr/lib/oracle/12.2/client64/lib
make -j8
make install

3. Cấu hình php.ini
 - Chuyển đến thư mục cài đặt php tìm  file lib/php.ini


cp php-7.1.12/php.ini-production /path/to/php/lib/php.ini

- Mở file php.ini và thêm cấu hình extension


vim /path/to/php/lib/php.ini
#add extension oci8
extension=oci8.so


[Centos][lib] Hướng dẫn cài đặt OpenSSL

1.Download lib

http://mirrors.ibiblio.org/openssl/source/

2.Setup

/config --prefix=/usr --openssldir=/usr/local/openssl shared
Try that config line instead to overwrite the default. It installs to prefix /usr/local/ssl by default in your setup when you leave off the prefix. You probably have /usr/local/ssl/bin/openssl instead of overwriting /usr/bin/openssl. You can also use /usr/local for prefix instead, but you would need to adjust your path accordingly if that is not already on your path. Here is the INSTALL documentation:
  $ ./config
  $ make
  $ make test
  $ make install

 [If any of these steps fails, see section Installation in Detail below.]

This will build and install OpenSSL in the default location, which is (for
historical reasons) /usr/local/ssl. If you want to install it anywhere else,
run config like this:

  $ ./config --prefix=/usr/local --openssldir=/usr/local/openssl

Thứ Tư, 6 tháng 4, 2016