Site Tools


web_server:cai-dat-server-chi-tai-cao

Cài đặt Server chịu tải cao chạy NukeViet 4

project này làm cho NukeViet 4 theo hướng tối ưu NukeViet cho các site có lượng truy cập lớn và rất lớn, không làm cho các site nhỏ, hay trên các hosting được. Khi xây dựng cần có nhiểu server riêng để cấu hình mới (Hoặc sử dụng trên các VPS mua tại các Cloud có thể thiết lập được Private Network)

1) Mô hình áp dụng:

Mô hình này được bạn Việt bên 123host đưa ra. Vũ Thảo là người thực hiện

Mô hình này đáp ứng được vấn đề gì? Đáp ứng được chia tải PHP và MySQL cho những website traffic cực lớn. Có đáp ứng được dự phòng không? Có nhưng chưa đủ, mới chỉ dự phòng cho các server webapp, database slave.

2) Các lưu ý

Mô hình này là mô hình này mình cố tình làm đơn giản nhất để phù hợp với cộng đồng. Ngoài các chú thích đã có trên hình, có một số lưu ý như sau:

Server lb1.nukeviet.vn:

Hiện chỉ chạy 1 mình, chưa có server dự phòng cho nó (HA - high availability). Nếu cần, mình sẽ lên một mô hình HA đầy đủ, tuy nhiên sẽ sử dụng thêm một số công nghệ phức tạp nên ban đầu mình sẽ không đưa vào. Khi có 1 trong 3 server web app gặp sự cố, Load balancer sẽ tự động tách nó ra, đảm bảo hệ thống hoạt động xuyên suốt. Như vậy các server webapp này không những chia tải mà còn dự phòng lẫn nhau. Thuật toán load balancing: Tùy chọn Caching phía server? Tất nhiên là được, nếu cache sẽ cache tại đây. Nhưng lại là vấn đề nâng cao và mình không đề cập tại mô hình này

Source code (bao gồm các file php và các file static) sẽ được lưu tập trung tại server lb1.nukeviet.vn. Các server webapp sẽ mount đến server lb1 qua network sử dụng NFS (network file system).

Lưu ý về perfomance: Nếu source website thường xuyên thay đổi (ví dụ xóa / tạo file liên tục xuống ổ cứng) thì NFS không phải là sự lựa chọn tối ưu. Lúc này có thể lưu file phân tán tại chính server webapp hoặc dùng công nghệ khác.

Lưu static file tại CDN?:

Nếu có CDN riêng thì sẽ để static file tại CDN hoặc CDN pass traffic static và LB1 và cache tại CDN. Phần này không ảnh hưởng đến mô hình.

MySQL Source code nukeviet cần hỗ trợ master/slave MySQL để điều hướng truy vấn mang tính chất thay đổi (insert, update, delete.v.v.) sang server Master, Các truy vấn chỉ đọc sẽ điều hướng đều sang các server slave còn lại. Tại đây server Master database cũng chưa có server dự phòng cho nó. Và cũng như mình đã trình bày, dự phòng này sẽ được đưa vào một mô hình nâng cao khác, không phải mô hình này.

Session Nukeviet sử dụng default session của server thì có thể dùng Memcache để lưu session tập trung tại server lb1.nukeviet.vn (cấu hình session.handler và session.save_path tại php.ini)

3) Tiến hành Cài đặt

Ghi chú: Hiện tại project này đang xây dựng, hiện tại các phần sau chưa xử lý được

  1. Xây dựng hệ thống MySQL master/slave (Phần này làm sau cùng do hiện tại nếu tách MySQL ra 1 máy chủ riêng thì CPU, IO load rất thấp).

Cài đặt Nginx trên lb1.nukeviet.vn

Sử dụng hệ điều hành CentOS 7.1, server này có 2 cạc mạng

Public Network 192.168.100.101 để nối thẳng ra internet
Private Network 192.168.56.100 để kết nối với các server nội bộ.

Bước 1: Cập nhật HDH

yum update -y

Bước 2: Nạp package

Do NGINX không có sẵn trong gói Yum mặc định của CentOS nên chúng ta phải nạp một package từ bên ngoài vào.

Sau đó tạo 1 file tên là nginx.repo trong thư mục /etc/yum.repos.d/ rồi copy đoạn dưới đây vào:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Nếu bạn muốn dùng NGINX bản mới nhất thì dùng đoạn dưới: (Tôi chọn bản này)

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Bước 3: Cài đặt NGINX

sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Bước 4: Cấu hình NGINX

## Main configuration file ##
/etc/nginx/nginx.conf
 
## Virtualhost configuration files on ##
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/
 
## Other config files on (if needed) ##
/etc/nginx/conf.d/

Mở file /etc/nginx/nginx.conf

Cấu hình worker_processes bằng số CPU của máy (Tìm số CPU bằng lệnh cat /proc/cpuinfo |grep processor)

Cấu hình các thông số trong thẻ http {

server_tokens off;

Khởi động lại nginx: sudo systemctl restart nginx sau đó truy cập vào địa chỉ IP để kiểm tra

Cài đặt Memcached

Có thể cài đặt trên lb1.nukeviet.vn, hoặc tạo thêm máy memcached.nukeviet.vn

yum install -y memcached
sudo systemctl start memcached
sudo systemctl enable memcached

Open Memcached Port (11211) on Firewall:

firewall-cmd --zone=internal --add-source=192.168.56.101/32 --permanent
firewall-cmd --zone=internal --add-source=192.168.56.102/32 --permanent
firewall-cmd --zone=internal --add-source=192.168.56.103/32 --permanent
firewall-cmd --zone=internal --add-port=11211/tcp --permanent
firewall-cmd --reload

Cài đặt PHP trên webapp1.nukeviet.vn

Trước khi cài đặt, hãy tiến hành tắt SELinux đi bằng cách mở file /etc/sysconfig/selinux và tìm

SELINUX= rồi sửa thành như dưới đây:

SELINUX=disabled

Sửa xong, hãy gõ lệnh reboot để khởi động lại máy chủ và đăng nhập vào lại SSH.

Cài CentOS 7.1 epel repository

sudo yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Cài PHP các module cần thiết:

yum --enablerepo=remi,remi-php56 install -y php-fpm php-mysql php-common php-mbstring php-mcrypt php-gd php-xml  php-memcached php-opcache

Kích hoạt NGINX, PHP và thêm 2 ứng dụng này vào danh sách ứng dụng tự khởi động nếu reboot server (gõ lần lượt các lệnh):

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

Kiểm tra phiên bản NGINX và PHP-FPM:

nginx -v
php-fpm -v

Open Port on Firewall:

firewall-cmd --zone=internal --add-source=192.168.56.100/32 --permanent
firewall-cmd --zone=internal --add-port=9000/tcp --permanent
firewall-cmd --reload

Thiết lập lại user và group chạy PHP

Mặc định PHP-FPM sẽ chỉ định user tên là apache và group tên apache để chạy nó, nhưng ở đây chúng ta không sử dụng Apache mà là NGINX nên bạn cần mở file /etc/php-fpm.d/www.conf lên và tìm:

user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

Thay thành

user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

Bây giờ bạn hãy mở file default.conf trong thư mục /etc/nginx/conf.d/ Thêm lên trên cùng đoạn:

upstream fpm_nukeviet {
	#ip_hash;
	server 192.168.56.101:9000;
	server 192.168.56.102:9000;
	server 192.168.56.103:9000;
}

Tìm đoạn

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

Sửa thành

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.php index.htm;
    }

Tìm đoạn

    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

Sửa thành

    location ~ \.php$ {
        root           /usr/share/nginx/html;
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass	fpm_nukeviet;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

Khởi động lại PHP-FPM

sudo systemctl restart php-fpm
sudo systemctl restart nginx

Sửa lỗi không tạo được session

chmod -R 777 /var/lib/php/session

Hoặc sửa file /etc/php.ini chuyển thư mục session sang /tmp/

Sử dụng session trên memcache Hoặc sửa file /etc/php.ini chuyển thư mục session sang /tmp/

session.save_handler = memcached
session.save_path = '192.168.56.100:11211'

Làm tương tự cho 2 máy webapp2.nukeviet.vn, webapp3.nukeviet.vn

Cài đặt MariaDB trên db1.nukeviet.vn

Tạo repo cho MariaDB

vi /etc/yum.repos.d/Mariadb.repo

Với nội dung

# MariaDB 10.1 CentOS repository list - created 2015-12-06 14:53 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Chạy lệnh dưới để cài đặt MariDB

sudo yum install MariaDB-server MariaDB-client

Kích hoạt MariDB ứng dụng này vào danh sách ứng dụng tự khởi động nếu reboot server

sudo systemctl start mariadb
sudo systemctl enable mariadb

Cấu hình MariaDB

    Set (Change) root password
    Remove anonymous users
    Disallow root login remotely
    Remove test database and access to it
    Reload privilege tables

– Bắt đầu cài đặt

/usr/bin/mysql_secure_installation

Ngay bước đầu tiên bạn sẽ bị hỏi root password, do mới cài đặt nên tất nhiên chưa có password, nhấn Enter để tiếp tục. Output tương tự như sau:

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we\'ll need the current
password for the root user. If you\'ve just installed MariaDB, and
you haven\'t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
... Success!

Normally, root should only be allowed to connect from \'localhost\'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
... Success!

By default, MariaDB comes with a database named \'test\' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
... Success!

Cleaning up...

All done! If you\'ve completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

4) Thiết lập NFS Server:

5) Cài đặt Session trên memcached, Thiết lập cache trên memcached

Cài đặt NukeViet 4 mới nhất. Cấu hình file /config.php.

Sửa dòng $global_config['cached'] = 'files';
thành $global_config['cached'] = 'memcached';

Thêm các dòng sau vào cuối file:

define( 'NV_MEMCACHED_HOST', '192.168.56.100' );
define( 'NV_MEMCACHED_PORT', 11211 );

ini_set( 'session.save_handler', 'memcached' );
ini_set( 'session.save_path', NV_MEMCACHED_HOST . ':' . NV_MEMCACHED_PORT );

(memcached đang được đặt tại: 192.168.56.100)

5) Kiểm thử lần 1:

web_server/cai-dat-server-chi-tai-cao.txt · Thời điểm thay đổi: 2015/12/11 04:19 do vuthao