Tính cài Webinoly hoặc CentminMod cho thèng haproxy.tech, mà không hiểu vì lý do thần thánh nào đó, ngay thời điểm đó, khi chạy setup cài đặt mặc định, cả Webinoly và Centmin đều có lỗi???
Quá là hi hữu luôn, cách đây ít hôm tình cờ xem 1 bài viết về cài đặt LCMP từ teddysun nên quyết định tự tạo độ khó cho game, sử dụng LCMP ((Linux + Caddy + MariaDB + PHP) trên AlmaLinux OS 9, VPS thì dùng gói miễn phí của Oracle cho thèng haproxy.tech 😛
Nói chung ở thèng haproxy.tech thì cứ cái gì mới nhất tống hết vào, AlmaLinux 9 nhìn có vẻ mới nên dùng thử luôn 😛
Các bước tuần tự như bên dưới, cơ bản thì cứ copy, paste vào là xong 😀
Các bước nhỏ ban đầu
- Tạo tài khoản root cho AlmaLinux OS 9 trên Oracle
sudo passwd root
(Điền mật khẩu và enter) – làm 2 lần để đổi password cho root
- Tiếp theo gõ
sudo yum install nano -y sudo nano /etc/ssh/sshd_config
Thêm vào 3 dòng
PermitRootLogin yes PasswordAuthentication yes ClientAliveInterval 7200
Ctrl+O -> Enter -> Ctrl+X để save và exit.
- Gõ tiếp lệnh sau để khởi động lại ssh:
sudo service sshd restart
Lúc này đã có thể login với tài khoản root
- Cập nhập AlmaLinux
sudo dnf update -y
- Thêm kho lưu trữ Epel
sudo dnf install epel-release -y
- Cài đặt htop, zip, unzip, screen
sudo dnf install htop -y sudo dnf install zip -y sudo dnf install unzip -y sudo dnf install screen -y sudo dnf install wget -y sudo dnf install wget -y
- Cài đặt RAM ảo
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo cp /etc/fstab /etc/fstab.bak echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab sudo sysctl vm.swappiness=10
- Tiếp theo là tắt SELINUX
sed -i 's@^SELINUX.*@SELINUX=disabled@g' /etc/selinux/config setenforce 0
- Tắt Firewall
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl mask --now firewalld
Cá nhân thì mình không sử dụng firewall mặc định trên OS, tại …. không thích 😀
Cài xong xuôi nếu thích thì cấu hình firewall từ cơ sở hạ tầng của Oracle sau
- Thay đổi DNS server
sudo nano /etc/resolv.conf
Nếu thấy có dòng nào bắt đầu bằng nameserver thì xóa đi, thay bằng 2 dòng bên dưới
nameserver 8.8.8.8 nameserver 1.1.1.1
- Cuối cùng là và khởi động lại OS cho sạch sẽ các thứ
sudo reboot
Thời gian khởi động trên AlmaLinux hay CentOS thường khá chậm so với Ubuntu
1. Cài đặt và cấu hình Caddy Web Server
dnf install -y dnf-plugins-core dnf copr enable @caddy/caddy -y && dnf install -y caddy && caddy version
Việc cài đặt Caddy nhanh một cách lú người 😀
- Tạo các thư mục mặc định
mkdir -p /data/www/default mkdir -p /var/log/caddy/ mkdir -p /etc/caddy/conf.d/ chown -R caddy.caddy /data/www/default chown -R caddy.caddy /var/log/caddy/
- Chỉnh sửa cấu hình Caddy
nano /etc/caddy/Caddyfile
- Xóa hết nội dung bên trong và thay bằng nội dung bên dưới
{ admin off } :80 { # Set this path to your site's directory. root * /data/www/default encode gzip # Enable the static file server. file_server { index index.html } # Serve a PHP site through php-fpm: php_fastcgi unix//run/php-fpm/www.sock { split .php index index.php } log { output file /var/log/caddy/access.log } } import /etc/caddy/conf.d/*.conf
Ctrl+O -> Enter -> Ctrl+X để save và exit.
2. Cài đặt và cấu hình MariaDB
- Cài đặt phiên bản MariaDB 10.11
wget -qO mariadb_repo_setup.sh https://downloads.mariadb.com/MariaDB/mariadb_repo_setup chmod +x mariadb_repo_setup.sh ./mariadb_repo_setup.sh --mariadb-server-version=mariadb-10.11 dnf install -y MariaDB-common MariaDB-server MariaDB-client MariaDB-shared MariaDB-backup
- Chỉnh sửa /etc/my.cnf.d/server.cnf để tạo mã hóa mặc định utf8mb4
lnum=$(sed -n '/\[mariadb\]/=' /etc/my.cnf.d/server.cnf) sed -i "${lnum}acharacter-set-server = utf8mb4\n\n\[client-mariadb\]\ndefault-character-set = utf8mb4" /etc/my.cnf.d/server.cnf
- Khởi động MariaDB
systemctl start mariadb
- Sửa mật khẩu của tài khoản root và các thứ không cần thiết
db_pass="Thisisdbrootpassword" mysql -e "grant all privileges on *.* to root@'127.0.0.1' identified by \"${db_pass}\" with grant option;" mysql -e "grant all privileges on *.* to root@'localhost' identified by \"${db_pass}\" with grant option;" mysql -uroot -p${db_pass} 2>/dev/null <<EOF drop database if exists test; delete from mysql.db where user=''; delete from mysql.db where user='PUBLIC'; delete from mysql.user where user=''; delete from mysql.user where user='mysql'; delete from mysql.user where user='PUBLIC'; flush privileges; exit EOF
3. Cài đặt và cấu hình PHP
- Cài đặt phiên bản PHP 8.2
dnf config-manager --set-enabled crb dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm dnf module reset -y php dnf module install -y php:remi-8.2
- Cài đặt các module
dnf install -y php-cli php-bcmath php-embedded php-gd php-imap php-mysqlnd php-dba php-pdo php-pdo-dblib php-pgsql php-odbc php-enchant php-gmp php-intl php-ldap php-snmp php-soap php-tidy php-opcache php-process php-pspell php-shmop php-sodium php-ffi php-brotli php-lz4 php-xz php-zstd dnf install -y php-pecl-imagick-im7 php-pecl-zip php-pecl-mongodb php-pecl-swoole5 php-pecl-grpc php-pecl-yaml php-pecl-uuid
- Chỉnh sửa tệp cấu hình php-fpm của PHP để hỗ trợ Caddy ( /etc/php-fpm.d/www.conf)
sed -i "s@^user.*@user = caddy@" /etc/php-fpm.d/www.conf sed -i "s@^group.*@group = caddy@" /etc/php-fpm.d/www.conf sed -i "s@^listen.acl_users.*@listen.acl_users = apache,nginx,caddy@" /etc/php-fpm.d/www.conf sed -i "s@^;php_value\[opcache.file_cache\].*@php_value\[opcache.file_cache\] = /var/lib/php/opcache@" /etc/php-fpm.d/www.conf
- Thay đổi quyền thư mục của PHP để hỗ trợ Caddy
chown root.caddy /var/lib/php/session chown root.caddy /var/lib/php/wsdlcache chown root.caddy /var/lib/php/opcache
- Chỉnh sửa tệp cấu hình PHP để phù hợp hơn với môi trường sản xuất và hỗ trợ các kết nối MariaDB (/etc/php.ini )
sed -i "s@^disable_functions.*@disable_functions = passthru,exec,shell_exec,system,chroot,chgrp,chown,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore@" /etc/php.ini sed -i "s@^max_execution_time.*@max_execution_time = 300@" /etc/php.ini sed -i "s@^max_input_time.*@max_input_time = 300@" /etc/php.ini sed -i "s@^post_max_size.*@post_max_size = 50M@" /etc/php.ini sed -i "s@^upload_max_filesize.*@upload_max_filesize = 50M@" /etc/php.ini sed -i "s@^expose_php.*@expose_php = Off@" /etc/php.ini sed -i "s@^short_open_tag.*@short_open_tag = On@" /etc/php.ini sock_location="/var/lib/mysql/mysql.sock" sed -i "s#mysqli.default_socket.*#mysqli.default_socket = ${sock_location}#" /etc/php.ini sed -i "s#pdo_mysql.default_socket.*#pdo_mysql.default_socket = ${sock_location}#" /etc/php.ini
4. Khởi động dịch vụ
- Khởi động PHP, Caddy và bật tự khởi động sau khi reboot server
systemctl start php-fpm systemctl start caddy systemctl enable mariadb systemctl enable php-fpm systemctl enable caddy
5. Cài đặt WordPress cho haproxy.tech
Tạo file cấu hình Caddy cho haproxy.tech
touch /etc/caddy/conf.d/haproxy.tech.conf nano /etc/caddy/conf.d/haproxy.tech.conf
- Điền vào nội dung bên dưới
www.haproxy.tech { redir https://haproxy.tech{uri} } haproxy.tech { header { # Strict-Transport-Security "max-age=31536000; preload" # X-Content-Type-Options nosniff # X-Frame-Options SAMEORIGIN } # Set this path to your site's directory. root * /data/www/haproxy.tech tls support@haproxy.tech encode gzip @disallowed { path /xmlrpc.php path /wp-content/uploads/*.php } rewrite @disallowed /index.php # Serve a PHP site through php-fpm php_fastcgi unix//run/php-fpm/www.sock # Enable the static file server. file_server { index index.html } log { output file /var/log/caddy/ssl_access.log { roll_size 100mb roll_keep 3 roll_keep_for 7d } } }
Cấu hình ở dòng 10, bắt đầu bằng tls email address là cấu hình cơ bản của Caddy, không rõ sao teddysun lại không dùng?
Không cấu hình dòng này, kết nối qua Cloudflare rất hay bị tình huống timeout
- Khởi động lại Caddy
systemctl restart caddy
Tạo 1 database mới cho Wordpress
- Login với tài khoản root
mysql -u root -p
Điền vào password root tạo ở bước 2
- Tạo 1 database với tên wordpress
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Tạo tài khoản wordpressuser với password là password
GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
- Thoát ra
FLUSH PRIVILEGES;
EXIT;
Cài đặt Wordpress
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar mv wp-cli.phar /usr/local/bin/wp mkdir -p /data/www/haproxy.tech cd /data/www/haproxy.tech wp core download --allow-root wp core config --dbhost=localhost --dbname=wordpress --dbuser=wordpressuser --dbpass=password --allow-root chown -R caddy:caddy /data/www/haproxy.tech find . -type d -exec chmod 755 {} \; find . -type f -exec chmod 644 {} \;
Lúc này bạn có thể gõ domain haproxy.tech vào trình duyệt để cài đặt tài khoản admin 😀
Chú ý ở dòng 8, set user là caddy:caddy thì mọi thứ mới chạy bình thường, phân quyền thư mục 755, file 644 thoải mái :]]
Có 1 điểm khá hài khi mình đọc bài viết gốc LCMP từ teddysun, lý do anh ấy chuyển từ Apache sang Caddy chỉ là vì Caddy hỗ trợ gia hạn chứng chỉ https … tốt hơn 😀 chạy acme.sh thi thoảng nó bị ngáo ngáo, không renew làm ssl bị lỗi 😛 thực tế thì từ 2017-2018, sau bài viết về HSTS, mình cũng đã nghỉ hẳn cái trò con bò là dùng ssl của Letsencrypt, dùng ssl của Cloudflare hạn sử dụng 15 năm, làm 1 lần là thôi, tự dưng ôm đầu máu vào cái vụ cứ 90 ngày bắt renew 1 lần làm gì 😛
Mà rõ ràng trên Apache, Nginx hay gì đều có thể dùng ssl của Clouflare trong 1 nốt nhạc, chuyển sang Caddy chỉ vì vụ này nghe cũng hơi kì 😛
6. Tinh chỉnh hiệu năng cho LCMP
- Cấu hình PHP (etc/php.ini)
nano etc/php.ini
Sửa lại các giá trị upload file và bỏ giới hạn các hàm trong PHP
max_execution_time = 3000 max_input_time = 3000 memory_limit = 512M upload_max_filesize = 50000M post_max_size = 50000M disable_functions = (xóa hết các dòng có sẵn tại đây)
Sử dụng opcache với thông số như bên dưới (dùng cấu hình từ Webinoly)
[opcache] ; see /etc/php.d/10-opcache.ini opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=100000 opcache.max_wasted_percentage=10
- Cấu hình PHP-FPM (/etc/php-fpm.d/www.conf) (dùng cấu hình từ Webinoly)
nano /etc/php-fpm.d/www.conf
Sửa lại
pm.max_children = 6 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 1000 ping.path = /ping request_terminate_timeout = 60
- Khởi động lại PHP
systemctl restart php-fpm
- Thêm vào ít dòng cấu hình riêng cho wp-config.php
define( 'DISABLE_WP_CRON', true ); define( 'COOKIE_DOMAIN', 'haproxy.tech' ); define( 'FS_METHOD', 'direct' ); define( 'WP_MEMORY_LIMIT', '256M' ); define( 'WP_MAX_MEMORY_LIMIT', '512M' );
- Cấu hình MariaDB
nano /etc/my.cnf
Thêm vào bên trong các dòng bên dưới
# The MariaDB configuration file [mysqld] innodb_buffer_pool_size = 200M innodb_log_file_size = 100M innodb_buffer_pool_instances = 8 innodb_io_capacity = 5000 max_binlog_size = 100M expire_logs_days = 3
- Khởi động lại MariaDB
systemctl restart mariadb
- Addon cài thêm
Mình có cập nhập curl lên bản mới nhất theo hướng dẫn tại đây
sudo dnf install wget gcc openssl-devel -y wget https://curl.se/download/curl-8.1.2.tar.gz gunzip -c curl-8.1.2.tar.gz | tar xvf - cd curl-8.1.2 ./configure --with-ssl make make install reboot
curl -V curl 8.1.2 (x86_64-pc-linux-gnu) libcurl/8.1.2 OpenSSL/3.0.7 Release-Date: 2023-05-30 Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile NTLM NTLM_WB SSL threadsafe TLS-SRP UnixSockets
Xong xuôi hết các thứ thì reboot VPS, cài đặt thử 1 ít plugin, theme, viết thử bài, ấn cập nhập các thứ, kiểm tra có vấn đề gì không 😛
7. Các vấn đề gặp phải
Vấn đề khá quái, có vẻ như liên qua tới Zend OPcache, nếu bạn vào 1 trang, mà trang đó PHP chưa bao giờ chạy, thì lần đầu tiên, nó load đặc biệt lâu, kiểu vừa ấn vào edit theme, nó phải load các file php lần đầu tiên ra, chưa cache được, nhưng từ lần sau cache rồi, chạy bình thường
Vấn đề này trên Nginx, OpenLiteSpeed, LiteSpeed hay Apache thì mình chưa gặp bao giờ, nó có chậm, cũng chỉ chậm hơi 1 tẹo, còn trên Caddy thì đặc biệt chậm
Ở phần cấu hình PHP, tác giả có thêm 1 dòng là sed -i “s@^;php_value\[opcache.file_cache\].*@php_value\[opcache.file_cache\] = /var/lib/php/opcache@” /etc/php-fpm.d/www.conf
Ý nghĩa đại khái nếu RAM đầy, nó sẽ chuyển file php đã được cache xuống HDD, vấn đề là kể cả mình có bỏ đi dòng này, thì khi load lần đầu các file PHP nặng, nó vẫn rất chậm
Khả năng khá cao lỗi đã được gạch ở trên là do AlmaLinux OS 9 trên Oracle có vấn đề, thử dùng hệ điều hành khác là Oracle Linux 8, cũng trên Oracle thì không gặp tình trạng này
8. Bất ngờ hay gây lú???
Nếu bạn đọc hết 7 đầu mục lớn ở trên, sẽ thấy LCMP trên AlmaLinux 9, khá là củ chuối, thậm chí vấn đề gặp phải khi dùng VPS Oracle có ổ cứng quá chậm khá là tệ
Tiện thể mình nhìn các đoạn code của teddysun, thấy ảnh viết khá tuần tự, hoàn toàn có thể viết 1 script nhỏ khác để chạy tuần tự các bước như trên, tiện cũng đang rảnh nên mình đưa luôn trên Github
Lúc này công đoạn cài đặt LCMP trên AlmaLinux 9 bao gồm khoàng 2 bước
- Cài đặt wget
sudo dnf install wget -y
- Cài đặt LCMP
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP/main/setup.sh -O setup_lcmp.sh && sudo chmod +x setup_lcmp.sh && sudo ./setup_lcmp.sh
Muốn cài đặt cho domain nào thì bạn chỉ làm bước 5 là được (các bước 1,2,3,4,6 đã được làm sẵn) nhưng lúc này VPS miễn phí của Oracle bị ngáo, VPS mới tạo ra không ping tới được :]]
Đành tạo 1 con VPS trên UpCloud dùng AlmaLinux 9 để thử code chạy ổn không 😀
Thời gian update, cài đặt tất cả mọi thứ trên UpCloud chưa tới 5 phút, copy đoạn code ở bước 5 xuống, enter thêm 2-3 cái là đã cài đặt xong Wordpress trên thèng haproxy.tech
Trên UpCloud thì không gặp vấn đề bị chậm OPcache như Oracle, trang nào ấn vào cũng chạy vèo vèo
-> chậm là do Oracle chứ không phải do cách cấu hình Caddy có vấn đề
Tiện lỡ tạo 1 con VPS trên Upload rồi thì thử hiệu năng luôn xem làm sao, vì trước giờ mình đều dùng cùng 1 cấu hình 1Gb RAM trên Upload
Task nếu chỉ cài đặt Wordpress cơ bản khá ít 😀 nhưng lượng RAM sử dụng đang khá là nhiều 😛 vấn đề này thì cũng dễ lý giải, do đợt này mình cấu hình MariaDB hơi khác 1 chút 😛
Tuy thế khi thử tới bài test hiệu năng chịu tải tại loader.io khá là lú người
Ở bài test 100 kết nối mỗi giây trên Wordpress mặc định, gần như các script auto đều pass
Cụ thể con số này ở Webinoly là 5.1s, Centmin Mod là ~4.7s, WPTangToc ~4.5s và đáng sợ làm sao, LCMP có thể xuống ~ 3.9s
Thành thật mà nói mình khá hoang mang về kết quả này, tác giả Centmin Mod là bậc thầy về tốc độ, tác giả Webinoly mình cũng rất ngưỡng mộ về chuyện tối ưu hệ thống, Caddy cài mặc định chẳng làm vẹo gì mà hơn được Nginx tối ưu tận răng thì vô lý quá 😀
Ngồi ngẫm lại thì thấy sự khác biệt nhiều nhất, có lẽ là ở PHP, trước đây khi dùng trên các trang cần ổn định, mình luôn duy trì dùng PHP 7.4, còn trên LCMP thì mình cho lên 8.2, tuy thế PHP nó liên quan nhiều ở tốc độ tải trang, chứ không phải ở vấn đề chịu tải
Ở MariaDB thì mình cũng chỉ cấu hình bừa, thực tế mình cũng chẳng hiểu các con số đó có nghĩa là gì =))
Kết luận:
Việc cài đặt và cấu hình LCMP ((Linux + Caddy + MariaDB + PHP) khá nhanh, cài đặt cũng khá đơn giản, chủ yếu vì teddysun viết cả rồi, copy paste về là chính 😀
Hiệu năng mặc định trên Caddy + MariaDB + PHP theo mình khá phò, dù Nginx (OpenLiteSpeed / LiteSpeed) + MariaDB + PHP cài mặc định cũng phò chẳng kém :]]
Tinh chỉnh hiệu năng như bước 6 thì kết quả cho ra khá là gây lú, mình nghĩ cần nhiều người cài đặt xong xem kết quả của họ làm sao mới có thể kết luận thêm 😀
Caddy được 1 ưu điểm như mình có nói ở trên, là hỗ trợ tạo ssl tốt, không cần cấu hình gì cả, nó cũng là 1 trong các webserver đầu tiên hỗ trợ HTTP/3
Dù 2 điểm này, ai dùng Cloudflare thì đều … đã có :]] thành ra ưu điểm của nó khá vô dụng với cá nhân mình
Khuyết điểm của nó thì sau khi google tầm 5 phút, bà con kháo nhau là Caddy không có cơ chế cache, muốn dùng phải cài addon bên thứ 3 viết vào, chứ mặc định Caddy không có, khuyết điểm này thì cũng vô dụng với mình, vì mình luôn dùng Cloudflare để cache 😛
Tạm thì ưu và khuyết của Caddy, với mình đều vô dụng cả 😀
Thực tế khuyết điểm nặng nhất của Caddy, theo mình là số lượng người sử dụng, theo các bài google, thì chắc chỉ 0.1% các trang web trên thế giới đang dùng Caddy làm webserver, nếu gặp lỗi gì, gần như bạn rất khó để tìm ra hướng dẫn hay giải pháp xử lý 😛
Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.
• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.
• ✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!