Cấu hình Server cho Site WordPress có lượng truy cập lớn

Xây Dựng Hosting WordPress phần 2: Cài đặt và cấu hình LEMP

Trong phần một loạt bài viết làm thế nào xây dựng Hosting WordPress, chúng tôi đã hướng dẫn các bạn cách chọn hệ điều hành cũng như cách kết nối máy chủ như thế nào, đồng thời cấu hình bảo mật căn bản cho nó, chúng tôi huy vọng bạn đã hoàn thành được các bước ở trên:

Danh sách serie các bài viết của chủ đề này:

[display-posts tag=”hwyourself”]

Trong phần hai này chúng tôi sẽ hướng dẫn bạn cài các dịch vụ cần thiết để chạy WordPress đó là PHP với phiên bản mới nhât 7.x, kế đến là hệ cơ sỏ dữ liệu MySql sau cùng là cài đặt web server Nginx

Nginx

Trước khi cài dặt nó thì bạn cần phải biết Nginx là gì, vậy nó là gì?

Nginx là một máy chủ proxy ngược mã nguồn mở sử dụng phổ biến giao thức HTTP, HTTPS, SMTP, POP3 và IMAP , cũng như dùng làm cân bằng tải, HTTP cache và máy chủ web (web server). Dự án Nginx tập trung vào việc phục vụ số lượng kết nối đồng thời lớn, hiệu suất cao và sử dụng bộ nhớ thấp. Nginx được biết đến bởi sự ổn định cao, nhiều tính năng, cấu hình đơn giản và tiết kiệm tài nguyên.

Để cài đặt em nó thì bạn chỉ cần chạy duy nhất một dòng lệnh dưới đây

sudo yum install nginx -y

một khi bạn cài dặt xong, để xác nhận nó có cài đặt thành công hay không chỉ cần chạy lệnh dưới đây

nginx -v

sau đó bạn cần khởi động nó lại cũng như thiết lập cho nó tự khởi động trong trường hợp server của bạn reboot, để làm điều đó chỉ cần chạy 2 lệnh sau

service nginx restart

chkconfig nginx on

ngoài ra khi bạn truy cập website thông qua url http://<your-ip-server> trong trường hợp của tôi là http://45.55.162.222, thì bạn sẽ thấy màn hình wellcome từ Nginx nó trong như thế này

Great, bạn đã cài đặt xong Nginx mặc định nó đã được tối ưu hoá(optimized) rồi, nhưng chúng ta sẽ optimized nó thêm. Trước khi bắt đầu bạn cần xác định xem VPS của bạn có bao nhiêu core CPU và giới hạn mở các tập tin

grep processor /proc/cpuinfo | wc -l

ulimit -n

trong trường hợp của tôi thì là core CPU là 1 và ulimit là 1024, kế đến bạn mở tập tin nginx.conf đê sữa vài tham số

vi /etc/nginx/nginx.conf

kết quả nó có dạng thế này

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
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  /var/log/nginx/access.log  main;

sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

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

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen       80 default_server;
listen       [::]:80 default_server;
server_name  _;
root         /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

[...]

nào hãy để tôi giải thich bạn, chú ý rằng có dấu # ở đằng trước là comment tức là nó không ảnh hưởng gì đến config hết cả

Trước tiên là tham số user mặc đinh nó là user nginx bạn cũng có thể thây đổi nó thành bất kỳ users nào có trên hệ thống của bạn, nhưng chúng ta không nên

Tiếp theo là tham số worker_processes nghĩa là tổng số processes tối đa mà NGINX được phép sử dụng, mặc định nó là auto, nhưng ở trên chúng ta kiểm tra core CPU là 1 nên bạn sữa nó là 1 cho tốt hơn. I think 🙂

Còn worker_connections nghĩa là số lượng kết nối được phép sử dụng cho mỗi process. Bạn nên đặt con số này là khoảng từ 1024 đến 5000 là đẹp. Nếu bạn có 2 core CPU và số tập tin mở tối đa là 1024 điều này có nghĩa là VPS của bạn có thể xử lý tối đa là 2×1024=2048

multi_accept nếu thông số này Disabled thì mỗi worker_processes chỉ chấp nhận 1 new connections tại một thời điểm. Ngược lại thì nó sẽ nhận hết tất cả new connections tại 1 thời điểm.

epoll mặt định nginx sẽ sử dụng select hoặc poll method để xác định một file có sẵn sàng để đọc hoặc ghi. Ví dụ khi mình muốn phục vụ 10000 connections tại một thời điểm và 1 trong số những connection này sẵn sàng để đọc thì lúc này process pải scan hết 9999 connections còn lại để tìm ra được ( file descriptor : thuật ngữ chuyên nghành. ) cho nó. Tóm lại là khi mình dùng use epoll thì sẽ tiết kiệm được khá nhiều resource cho hệ thống.

Compression Khi bật gzip module của nginx lên thì nó sẽ nén dữ liệu lại trước khi truyền tải đến client làm cho dữ liệu truyền tải nhỏ hơn chiếm ít băng thông và nhanh hơn. Tuy nhiên do phải nén dữ liệu nên sẽ tiêu hao 1 lượng CPU. Bạn có thể coi nó trong tập tin /etc/nginx/mime.types

types {
text/html                             html htm shtml;
text/css                              css;
text/xml                              xml;
image/gif                             gif;
image/jpeg                            jpeg jpg;
application/javascript                js;
application/atom+xml                  atom;
application/rss+xml                   rss;

text/mathml                           mml;
text/plain                            txt;
text/vnd.sun.j2me.app-descriptor      jad;
text/vnd.wap.wml                      wml;
text/x-component                      htc;

image/png                             png;
image/tiff                            tif tiff;
image/vnd.wap.wbmp                    wbmp;

[...]

sau khi bạn thây đổi nó xong, thì thử chạy lệnh dưới đây để kiểm tra lại mọi thứ OK không

nginx -t

nếu mọi thư đều ổn thì bạn cần phải restart nó lại với mỗi lần bạn thây đổi nó

service nginx restart

nào kế tiếp chúng ta sẽ cài PHP và PHP-FPM

PHP và PHP-FPM

Trong bài viết này kỹ thuật Gsviec hướng dẫn bạn cài đặt PHP version 7, với các phiên bản php khác người dùng thực hiện tương tự

Cài đặt thêm gói epel và webtatic repository:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Sau khi chạy lệnh bên trên kia xong bạn chỉ cần chạy lên bên dưới để cài đặt PHP và PHP-FPM

yum install php70w php70w-fpm php70w-opcache \
php70w-bcmath  php70w-cli php70w-common \
php70w-devel php70w-gd php70w-intl php70w-mbstring \
php70w-mcrypt php70w-mysqlnd php70w-pdo php70w-pecl-imagick \
php70w-xml  php70w-json --skip-broken -y

yum remove ImageMagick-last-6.9.5.10-1.el7.remi.x86_64 -y
yum install php70w-pecl-imagick -y

Có thể kiểm tra lại trạng thái hoạt động và phiên bản đang sử dụng bằng:

php -v

kết quả sẽ trong giống như thế này

PHP 7.0.15 (cli) (built: Jan 19 2017 21:35:05) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.15, Copyright (c) 1999-2017, by Zend Technologies

mặc định php-fpm không có chế độ tự khỏi động khi bạn reboot server do đó bạn cần phải bật nó lên, chỉ cần chạy lệnh sau:

systemctl enable php-fpm

tới đây là coi như bạn đã cài xong php-fpm rồi, nhưng chúng ta hãy phân tích rõ hơn vài thành phần của nó, để cho bạn hiểu hơn, mặc định các thành phần mở rộng php sẽ nằm trong thư mục /etc/php.d bạn cũng có thể chạy lệnh này để kiểm tra:

ls /etc/php.d/

có 2 file php cấu hình mà chúng ta cần quang tâm đó là /etc/php.ini/etc/php-fpm/www.conf, hãy phân tích nó nào. Bạn hãy mở nó bằng lệnh sau:

vi /etc/php-fpm/www.conf

nó sẽ có dạng như thế này:

dùng chuột di chuyển để tìm 4 tham số sau:

user = apache
group = apache
listen.owner = apache
listen.group = apache

trong đó apache chính là username chạy PHP-FPM bạn có thể thây đổi nó thành nginx, không thây đổi cũng được. Kế tiếp là dòng mã này

listen = 127.0.0.1:9000

mặc định PHP-FPM hoạt động thông qua giao thức TCP ở địa chỉ 127.0.0.1 và port 9000. Bạn nên sử dụng Unix socket để tăng hiệu suất cho các kết nối, kết nối của bạn sẽ nhanh hơn và bảo mật hơn. Để sử dụng Unix socket, bạn cần thay thế 127.0.0.1:9000 thành /var/run/php-fpm/www.sock

listen = /var/run/php-fpm/www.sock

một tip cho bạn, thây vì dùng vi để edit file thì bạn có thể dùng sed trong linux làm nhanh hơn bạn chỉ cần chạy lệnh sau:

sed -i "s|listen = 127.0.0.1:9000|listen = /var/run/php-fpm/www.sock|g" /etc/php-fpm.d/www.conf

tiếp tục hãy phân tích tiếp file php.ini. Thông thường khi cài đặt xong wordpress bạn cần cài đặt plugin và theme cho wordpress hoạt động hiểu quả hơn thì bạn sẽ gặp lỗi limit khi upload tập tin đó, để khắc phục điều này chỉ cần thây đổi client_max_body_size trong nginx.conf và upload_max_filesize, post_max_size trong php.ini, bạn có thể dùng vi để làm điều đó, nhưng tôi thích dùng sed hơn

sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 20M|g"  /etc/php.ini

sed -i "s|post_max_size = 8M|post_max_size = 80M|g"  /etc/php.ini

hai câu lệnh trên có ý nghĩa là tìm upload_max_filesize = 2M và post_max_size = 8M trogn file php.ini rồi thây thế giá trị nó thành 20M và 80M, mọi thứ đã xong thử chạy lệnh dưới đây để xác nhận nó

php-fpm -t

cuối cùng bạn hãy khởi động lại dịch vụ php-fpm thông qua lệnh sau:

service php-fpm restart

để chắc chắn là php-fpm có chạy hay không thì bạn có thể dùng lệnh service php-fpm status hoặc dùng lệnh top để xem

top

sau đó bạn nhấn phím SHIT với M thì bạn sẽ thấy tiến trình php-fpm và nginx làm việc, nó nên có kết quả giống hình bên dưới đây, nếu không thì bạn nên xem lại có cấu hình sai sót chỗ nào không

Cài đặt MySQL

Mặc định repo của Centos là MariaDB, nhưng một vài lý do tôi chọn Mysql tôi sẽ giải thích vấn đề này sau, do đó bạn cần phải thêm repo cho Centos, chỉ cần chạy lệnh bên dưới

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm

Tiến hành cài đặt và khởi động mysql

sudo yum install -y  mysql-server
sudo systemctl start mysqld

tương tự như trường hợp php bạn bật chế độ tự khỏi động cho mysql qua dòng lệnh sau:

systemctl enable mysqld

mặc định cài xong thì password của mysql là rỗng, nên chúng ta cần phải cấu hình nó để
làm điều này bạn chạy lệnh sau:

mysql_secure_installation

sau khi chạy lệnh trên thì nó sẽ hỏi bạn mật khẩu hiện tại của mysql là gì, bạn cứ nhấn enter

sau khi nhấn enter xong nó hỏi bạn có muốn thiêt lập lại mật khẩu root, nó có dạng như thế này

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 MySQL
root user without the proper authorisation.

Set root password? [Y/n]

bạn chỉ việc chèn chữ y vào tức là yes đồng ý, sau đó nó xuất hiện đoạn text sau:

New password:

chỗ này là chỗ bạn điền password vào nó sẽ không hiện chữ bạn viết ra trên đó đâu, sau đó nhấn enter tiếp nó sẽ bắt bạn xác nhận lại password lần nữa, sau khi bạn enter tiếp nó hỏi bạn có muốn xoá tài khoản ấn danh không, bạn có thể chon y hoặc n

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL 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!

tiếp đến nó hỏi bạn có tắt account của root Mysql không, ngay lúc này bạn nên dùng nó nên bạn không nên tắt do đó chúng tôi sẽ điền là “n”

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] n

cuối cùng thì bạn điền giống như bên dưới

By default, MySQL 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] n
... skipping.

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

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

hãy chú ý chỗ *[Y/n], cuối cùng hãy xác nhận bạn đã thây đổi mật khẩu root của Mysql này thành công hay chưa

mysql -u root -p

sau đó xác nhận lệnh password bạn nên thấy kết quả như thế này

Cấu hình Block(Vhost) Nginx

Điều cuối cùng ta cần làm là tạo các Vhost cho nginx, nếu bạn chưa biết Vhost là gì thì đây là định nghĩa về nó

Vhost là một cấu hình trong Nginx(Apache) để cho phép nhiều domain cùng chạy trên một máy chủ.

Trước tiên bạn mở file /etc/nginx/nginx.conf sau đó thêm vào đoạn code include /etc/nginx/vhost/*.conf;

vi /etc/nginx/nginx.conf

include /etc/nginx/vhost/*.conf; có nghĩa là nó sẽ gộp các file cấu hình trong thư mục vhost vào nginx, kế đến bạn tạo thư mục vhost, trong thư mục vhost là cấu hình cho website tương ứng của bạn, dưới đây là toàn bộ nội dung trong file nginx.conf

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
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  /var/log/nginx/access.log  main;

sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

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

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen       80 default_server;
listen       [::]:80 default_server;
server_name  _;
root         /usr/share/nginx/html;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
## Chỗ bạn thêm vhost
include /etc/nginx/vhost/*.conf;

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

để tạo thự mục vhost bạn chỉ cần chạy lệnh sau:

mkdir /etc/nginx/vhost

sau đó bạn trong thư mục vhost bạn tạo một tập tin là test.conf với nội dung sau:

server {

listen   80;
server_name gsviec.dev;

index index.php index.html index.htm;
root /usr/share/nginx/html;

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

}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

hãy để chúng tôi giải thích hai tham số quan trọng, tham số đầu tiên là server_name chỗ này chính là domain(tên miền) mà bạn đã mua, có thể là subdomain, trong trường hợp của tôi là gsviec.dev, cuối cùng là tham số root có nghĩa là trỏ đến thư mục chứa web của bạn trên VPS. Tất cả đã xong cuối cùng là bạn cần restart lại nginx

service nginx restart

Để trình duyệt nó hiểu http://gsviec.dev thì chúng tôi cần phải cấu hình DNS cho nó, nhưng ngay lúc này bạn chỉ cần cấu hình file host cho nó, để hiểu và thêm vào file host thì bạn có thể xem tại đây

Nếu bạn dùng Unix/Linux thì có thể làm cách này một cách nhanh chóng

echo "45.55.162.222 gsviec.dev" >> /etc/hosts

cuối cùng đê kiểm tra nó có chạy hay không, bạn tạo tập tin test.php trong thư mục **
/usr/share/nginx/html** với nội dung sau:

<?php

echo "Hello PHP";

thử kiểm tra kết quả xem nào, mở Firefox sau đó gõ vào http://gsviec.dev/test.php

Oops, không như chúng tôi mong đợi, để biết lỗi này là lỗi gì bạn cần xem file log của nginx, chỉ cần chạy lệnh sau

tail -f /var/log/nginx/error.log

sau khi chạy lệnh trên kết quả của tôi như hình bên dưới:

dựa vào hình đó thì chúng tôi đoán là lỗi permission nginx không đủ quyền truy cập cái file /var/run/php-fpm/www.sock, có nhiều cách fix điều này nhưng ngay lúc này chi cần bạn chạy lệnh dưới đây là có thể fix:

chmod 777 -R /var/run/php-fpm/

thử reload lại trang http://gsviec.dev/test.php xem nào

nếu bạn có kết quả tương tự như hình trên thì chúc mừng bạn đã hoàn thành xong phần 2

Kết luận

Trong phần này chúng tôi đã hướng dẫn bạn cách cách cài đặt Nginx, PHP-FPM and Mysql hay gọi tắt là LEMP, cũng như cấu hình và hiểu căn bản các dịch vụ đó trong phần tiếp theo chúng tôi sẽ hướng dẫn các bạn cách cài đặt WordPress cũng như cấu hình nhiều website trên đó

Leave a Comment

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Scroll to Top