Webinoly – Script cài đặt LEMP đơn giản


Webinoly là một bộ công cụ mạnh mẽ và miễn phí được thiết kế để triển khai và quản lý máy chủ web Nginx một cách dễ dàng, đặc biệt phù hợp cho việc chạy WordPress và các ứng dụng PHP khác. Webinoly giúp tự động hóa nhiều tác vụ phức tạp liên quan đến cấu hình máy chủ, tối ưu hóa hiệu suất, bảo mật và quản lý chứng chỉ SSL.

Webinoly có thể chạy trên x86_64, arm64, thậm chí chỉ có IPv6 cũng chạy, siêu đa năng

Tính năng nổi bật của Webinoly

1. Cài đặt nhanh và dễ dàng

  • Chỉ với một dòng lệnh, bạn có thể thiết lập toàn bộ máy chủ Nginx, PHP, MariaDB và WordPress.
  • Tiết kiệm thời gian và giảm thiểu sai sót khi cấu hình thủ công.

2. Bảo mật mạnh mẽ

  • Hỗ trợ chứng chỉ SSL miễn phí từ Let’s Encrypt.
  • Tích hợp sẵn các công cụ bảo mật như Fail2Ban và cấu hình tường lửa.

3. Hiệu suất tối ưu

  • Tích hợp sẵn FastCGI Cache và Redis Cache để tăng tốc trang web.
  • Tối ưu hóa cấu hình Nginx để phục vụ nhiều lượt truy cập cùng lúc.

4. Quản lý WordPress hiệu quả

  • Hỗ trợ cài đặt WordPress Multisite.
  • Tích hợp WP-CLI để quản lý WordPress qua dòng lệnh.

5. Giám sát và phân tích

  • Cung cấp công cụ giám sát tài nguyên hệ thống và nhật ký máy chủ.
  • Dễ dàng theo dõi hiệu suất và tình trạng hoạt động của máy chủ.

6. Linh hoạt và tùy chỉnh cao

  • Hỗ trợ nhiều phiên bản PHP.
  • Cho phép cấu hình máy chủ theo nhu cầu cụ thể.

Nếu bạn đang tìm kiếm một giải pháp đơn giản nhưng mạnh mẽ để quản lý máy chủ WordPress trên Nginx, Webinoly là lựa chọn tuyệt vời!

Ports Configuration

  • 22/TCP (Inbound/Outbound)
  • 25/TCP (Outbound)
  • 80/TCP (Inbound/Outbound)
  • 443/TCP (Inbound/Outbound)
  • 587/TCP (Outbound) *Optional for SMTP
  • 11371/TCP (Outbound) *GPG Keys
  • 22222/TCP (Inbound) *Admin area

Mặc định phần lớn các nhà cung cấp VPS đều mở sẵn tất cả các port, các dịch vụ kiểu Oracle, Google, Amazon …. khóa theo mặc định thì vào mở các port theo yêu cầu ở trên là được 

Cài đặt

Việc cài đặt Webinoly rất đơn giản, chỉ 1 dòng lệnh, tuy thế sau nhiều năm sử dụng, chạy trên đủ các loại VPS, đủ các hãng, mình đề xuất cài đặt các lệnh tuần tự như bên dưới, sẽ hạn chế tối đa chuyện cài đặt gặp lỗi

Cập nhập OS

sudo apt update && sudo apt upgrade -y && sudo reboot

Sau khi cập nhập OS thì tự reboot lại VPS cho sạch sẽ

Cập nhập locale

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

Kể từ thời Webinoly mặc định dùng PHP v8, nếu không cập nhập locale, trên 1 số VPS, đôi lúc cài đặt PHP sẽ bị lỗi

Cài đặt Webinoly

wget -qO weby qrok.es/wy && sudo bash weby

Cài đặt mặc định, Webinoly đã tự cấu hình server, các thông số liên quan tới mạng, ping, bbr, cho tới các thứ liên quan tới PHP, Nginx …

Khi dùng 1 thời gian, bắt đầu quen dần, bạn có thể custom các cấu hình, như lựa chọn phiên bản PHP, MySQL …

Tắt firewall

sudo apt remove iptables-persistent -y
sudo ufw disable
sudo iptables -F

Cá nhân mình chẳng bao giờ nhìn, hay học các lệnh về firewall trên OS, một số nhà cung cấp VPS như Oracle mặc định bật firewall ngay trong Ubuntu OS, nên tắt đi cho đỡ phiền

Nếu thích dùng firewall, có thể chặn thông qua firewall của Cloudflare hoặc từ chính nhà cung cấp VPS, nó chặn từ trước khi vào VPS, đỡ tài nguyên và hiệu quả hơn

Sau khi cài đặt xong, có thể chạy 1 lệnh để kiểm tra tổng quát các thứ

sudo webinoly -info

Các con số tác giả tinh chỉnh, dựa vào cấu hình phần cứng của VPS, cân bằng rất tốt giữa hiệu năng, bảo mật và tốc độ, rất hoàn hảo cho 1 hệ thống cơ bản, thứ duy nhất Webinoly không cấu hình là các thông số liên quan tới MySQL MariaDB.

Cài đặt WordPress trên Webinoly

site example.com -wp

Trong đó “example.com” thay bằng domain của bạn

Tác giả cũng cài đặt sẵn symbolic link, trên ssh bạn gõ thư mục root sẽ thấy đường dẫn thư mục chính

Truy cập vào thư mục trên các domain hay cấu hình nginx đều rất nhanh, đỡ phải nhớ vị trí các thư mục con

Config /etc/nginx/sites-available
Root /var/www/example.com/htdocs

Dùng các tool khác, mình sẽ phải ghi nhớ thư mục config, thư mục root của domain xem nằm ở đâu, dùng Webinoly thì chỉ cần gõ thư mục root là thấy rồi, đây là 1 điểm rất nhỏ, chỉ tầm 1 dòng code bổ xung, mà không thấy tool script auto nào khác làm

Tắt HTTP Authentication

sudo httpauth example.com -wp-admin=off

Mặc định Webinoly sử dụng “HttpAuth” để tạo thêm 1 lớp login cho các trang như wp-admin, với mình là không cần thiết, thành ra mình tắt tính năng này đi

Cài đặt SSL

Bạn có thể cài ssl bằng lệnh bên dưới

sudo site example.com -ssl=on

Nếu cần có thể tạo Wildcard SSL, dùng được cho tất cả các domain và subdomain đi kèm

sudo site example.com -ssl=on -wildcard

Dù các tác giả đã cấu hình tự renew SSL, nhưng mình thấy khá phiền, nếu bạn thường xuyên tạo xóa SSL trên các domain giống nhau, Let’s Encrypt rất hay báo lỗi

Dùng TLS certificate signed by Cloudflare, chỉ phải tạo SSL 1 lần duy nhất từ Cloudflare, sau đó có thể dùng khóa .key.pem này cho cả domain chính và tất cả subdomain, thời gian sử dụng tới 15 năm, đỡ rất nhiều thời gian đi xử lý các thứ liên quan tới SSL

Vào phần SSL/TLS -> Origin Server -> Create Certificate
Chọn như mặc định là được, thời gian chọn 15 năm

Nó sẽ tạo cho bạn 2 phần, private key và origin certificate, origin certificate bắt đầu bằng —–BEGIN CERTIFICATE—– và kết thúc bằng —–END CERTIFICATE—–, private key bắt đầu bằng —–BEGIN PRIVATE KEY—– và kết thúc bằng —–END PRIVATE KEY—–

Dùng 1 phần mềm edit text nào đó, sau đó save private key thành file có phần mở rộng là .key (duy.asia.key), save origin certificate thành file có phần mở rộng là .pem (duy.asia.pem)

Upload 2 file này lên VPS của bạn, upload vào đâu thì tùy, mình thì upload nó vào /etc/nginx/ssl, chủ yếu cho dễ nhớ thôi 😀

Mở file NGINX config của domain bằng lệnh sau:

/etc/nginx/sites-available/duy.asia

Thêm dòng bên dưới trong server {}

listen 443 ssl;
listen [::]:443 ssl http2; 
ssl_certificate /etc/nginx/ssl/duy.asia.pem;
ssl_certificate_key /etc/nginx/ssl/duy.asia.key;

Sau đó chạy tiếp dòng dưới để reload lại nginx, để thay đổi có hiệu lực

nginx -t
service nginx reload

Vào trang quản trị của Cloudflare, tới phần SSL/TLS -> Overview -> Full (strict)

Yêu cầu hstspreload.org cấp phép

Trước đây, để yêu cầu hstspreload cấp phép, ta phải cấu hình khá nhiều thứ, ở 2023 mình thấy Cloudflare đã hỗ trợ tự động cả rồi, bạn chỉ cần set theo hình là được

Do quản lý HSTS qua Cloudflare, nên trên các web server khác nhau đều có tác dụng, Nginx, Apache, LiteSpeed, OpenLiteSpeed …. nó rất tiện vì kiểu vì nhiều lý do, bạn có thể đổi qua nhiều web server khác nhau thì đều không cần phải cấu hình lại

Sau đó chọn Save

Lúc này kiểm tra tiêu đề trang duy.asia, nó sẽ có đoạn tiêu đều hstspreload yêu cầu

Xong xuôi thì bạn vào domain.com để cài đặt WordPress như thông thường

Backup và restore server

Đây là 1 tính năng được tác giả quảng cáo là “Moving or migrating a site or the whole server has never been so easy!”

Ở VPS gốc, tạo 1 bản backup bằng lệnh bên dưới

sudo webinoly -backup=local -export

File backup sẽ được lưu trữ xuống thư mục root(/root/webinoly_full_backup_2025-01-01-06:00:00)

Trên VPS mới, cài đặt bằng Webinoly tùy chọn -clean

sudo wget -qO weby qrok.es/wy && sudo bash weby -clean

Upload file webinoly_full_backup lên VPS mới, sau đó chạy lệnh import tại server mới

sudo webinoly -backup=local -import=full -file=/root/webinoly_full_backup_2025-01-01-06_00_00

Thời gian cài đặt và restore lại toàn bộ mọi thứ khá nhanh, mình thử trên Oracle ổ cứng 50MB/s cũng mất chỉ ít phút

Webinoly Stack Server was built using your imported configuration!
Database successfully imported!
MySQL/MariaDB has been successfully Optimized by Webinoly!
MySQL/MariaDB settings has been updated successfully!
Webinoly Full Server Backup imported successfully!

Lúc này chỉ việc đổi lại DNS sang server mới là xong, mình có chạy thử thì thấy mọi thứ diễn ra mượt như bơ

Trong trường hợp sử dụng lâu dài, thi thoảng bạn sẽ gặp tình huống bản backup cũ và bản script mới nó không cùng 1 phiên bản, có thể gặp 1 số thông báo lỗi nhất định, lúc này có thể chạy lại lệnh reset để chỉnh sửa lại

sudo webinoly -server-reset

Backup tự động lên cloud với Rclone

Nếu AE muốn tạo bash tự động backup và upload lên Google Drive, OneDrive, Cloudflare R2 thì làm theo cách này nhé:

Cài đặt Rclone

Cài đặt Rclone trên VPS:

sudo -v ; curl https://rclone.org/install.sh | sudo bash

Dùng command rclone config sau đó làm tuần tự từng bước như giao diện trên màn hình

Hoặc có thể dùng nhanh các lệnh mình soạn sẵn

cd /root/.config/rclone
touch rclone.conf
nano rclone.conf

Nhập nội dung bên dưới, sửa 3 giá trị access_key_id, secret_access_key, endpoint của bạn vào

[cloudflare-r2]
type = s3
provider = Cloudflare
access_key_id = 6efd88705eab8b07ef45e6530fc544da
secret_access_key = a43f5718804b32045217069032d738b1577561ecd825b2607ab5d42e6a303c1e
region = auto
endpoint = https://c0c354807827046621d330d8b370f7a4.r2.cloudflarestorage.com

Bấm Ctrl+O -> Enter -> Ctrl+X để save và exit

File cấu hình Cloudflare R2 tên là cloudflare-r2

Cấu hình rclone config cho Google Drive. Đơn giản nhất là cấu hình thông qua bản Rclone trên PC

Download bản cài đặt cho Windows (hoặc macOS), giải nén ra, sau đó chạy các commands trên Windows tương tự như trên VPS. Các bước hơi dài dòng, nếu bạn chưa quen thì cứ làm từ từ như bên dưới

rclone config

Bấm n để tạo 1 cấu hình mới

Đặt tên google-drive

Type 19 để chọn dùng Google Drive

client_id> và client_secret> bấm Enter để bỏ qua

Ấn 1 để chọn Full access all files, excluding Application Data Folder

service_account_file> bấm Enter để bỏ qua

Edit advanced config? bấm Enter để chọn No (default)

Use web browser to automatically authenticate rclone with remote? bấm Enter để chọn Yes (default)

Lúc này trình duyệt sẽ tự kết nối tới Google

Chọn tài khoản muốn dùng rồi ấn Allow để đồng ý

Success!
All done. Please go back to rclone.

Configure this as a Shared Drive (Team Drive)? bấm Enter để chọn No (default)

Keep this "google-drive" remote? ấn Enter để chọn Yes this is OK (default)

Tiếp theo chạy lệnh

rclone config file

Nó sẽ hiện ra đường dẫn file cấu hình Rclone trên Windows

Configuration file is stored at:
C:\Users\duyasia\AppData\Roaming\rclone\rclone.conf

Mở ra bạn sẽ thấy cấu hình tương tự như sau

[google-drive]
type = drive
scope = drive
token = {"access_token":"ya29.a0AfB_byAeD6ZO","token_type":"Bearer","refresh_token":"1//0ejEG80JYuwupCgYIARAAGA4SNwF-L9IrC","expiry":"2025-01-01T06:00:00.7840299+07:00"}
team_drive =

Bổ xung cấu hình này vào cấu hình rclone trên VPS

[cloudflare-r2]
type = s3
provider = Cloudflare
access_key_id = 6efd88705eab8b07ef45e6530fc544da
secret_access_key = a43f5718804b32045217069032d738b1577561ecd825b2607ab5d42e6a303c1e
region = auto
endpoint = https://c0c354807827046621d330d8b370f7a4.r2.cloudflarestorage.com

[google-drive]
type = drive
scope = drive
token = {"access_token":"ya29.a0AfB_byAeD6ZO","token_type":"Bearer","refresh_token":"1//0ejEG80JYuwupCgYIARAAGA4SNwF-L9IrC","expiry":"2025-01-01T06:00:00.7840299+07:00"}
team_drive =

Tạo file bash để tự backup

Có thể tạo các lệnh bên dưới thành 1 file tên là backup-daily.sh, upload nó vào thư mục root cũng được

#!/bin/bash

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/var/www/mysql/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

# backup database
mkdir -p $BACKUP_DIR
echo "Starting Backup Database";
databases=`$MYSQL -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
        $MYSQLDUMP --force --opt $db | gzip > "$BACKUP_DIR/$db.gz"
done
echo "Finished";
echo '';

# zip source code + database
echo "Starting zip source code + database";
tar -cvf backup_DUYASIA_$TIMESTAMP.tar /var/www /etc/mysql/my.cnf /var/spool/cron/crontabs/root /etc/nginx/ssl /root/backup-daily.sh

# upload to Google Drive
echo "Starting upload to Google Drive";
rclone copy backup_DUYASIA_$TIMESTAMP.tar google-drive:DUYASIA_BACKUP --progress
rclone delete google-drive:DUYASIA_BACKUP --min-age 31d

# upload to Cloudflare
echo "Starting upload to Cloudflare R2";
rclone copy backup_DUYASIA_$TIMESTAMP.tar cloudflare-r2:DUYASIA_BACKUP --progress
rclone delete cloudflare-r2:DUYASIA_BACKUP --min-age 1d

#delete backup
echo "Deleting backup on VPS";
rm backup_DUYASIA_$TIMESTAMP.tar
rm -rf $BACKUP_DIR
echo "Finished";
echo '';

Phân quyền để file có thể chạy

chmod +x /root/daily-backup.sh

Tạo cron để tự chạy file bash này mỗi ngày lúc 1h sáng

crontab -l > daily-backup
echo "0 1 * * * /root/daily-backup.sh" >> daily-backup
crontab daily-backup

Monitor

Cấu hình thêm 1 thông báo vào Telegram mỗi khi backup thành công, vì mình ít khi vào check Google Drive nên thông báo Telegram sẽ tiện theo dõi hơn

#!/bin/bash

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/var/www/mysql/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0
start=`date +%s`

# backup database
mkdir -p $BACKUP_DIR
echo "Starting Backup Database";
databases=`$MYSQL -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
        $MYSQLDUMP --force --opt $db | gzip > "$BACKUP_DIR/$db.gz"
done
echo "Finished";
echo '';

# zip source code + database
echo "Starting zip source code + database";
tar -cvf backup_DUYASIA_$TIMESTAMP.tar /var/www /etc/mysql/my.cnf /var/spool/cron/crontabs/root /etc/nginx/ssl /root/backup-daily.sh

# upload to Google Drive
echo "Starting upload to Google Drive";
rclone copy backup_DUYASIA_$TIMESTAMP.tar google-drive:DUYASIA_BACKUP --progress
rclone delete google-drive:DUYASIA_BACKUP --min-age 31d
end=`date +%s`
runtimeGD=$((end-start))

# upload to Cloudflare
echo "Starting upload to Cloudflare R2";
rclone copy backup_DUYASIA_$TIMESTAMP.tar cloudflare-r2:backup --progress
rclone delete cloudflare-r2:backup --min-age 1d
end=`date +%s`
runtimeCF=$((end-start))

#delete backup
echo "Deleting backup on VPS";
rm backup_DUYASIA_$TIMESTAMP.tar
rm -rf $BACKUP_DIR
echo "Finished";
echo '';

# Set up Telegram bot API and chat ID
BOT_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CHAT_ID="yyyyyyyyy"

MESSAGE="Đã tạo backup cho DUYASIA lên Google Drive ($runtimeGD giây) và CloudFlare ($runtimeCF giây)"
curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"

Sau khi chạy xong, ta sẽ nhận được 1 thông báo từ Telegram như sau

Đã tạo backup cho DUYASIA lên Google Drive (100 giây) và CloudFlare (101 giây)

Dựa vào thời gian hoàn thành, ta có thể biết được VPS đang dùng, hiệu năng CPU, HDD, SPEED …. có bị nhà cung cấp bóp lại không

Kiểu bình thường chạy backup chỉ mất tầm 90-100s, thời gian sau thông báo 150s mới xong, rõ ràng CPU, HDD, SPEED …. đang có vấn đề, vào kiểm tra lại là được

Có thêm thông báo như này tiện và dễ quản lý hơn

Các câu lệnh khác

Tác giả hỗ trợ rất nhiều thứ như cấu hình cài đặt riêng, hiện tại mình dùng cách này để tự cài đặt các cấu hình hay dùng, như chủ động cài PHP 7.4, MySQL 10.3 và 1 số cấu hình nhỏ khác

External Database đây là thứ ngày xưa mình dùng để chạy trên 2 con VPS Oracle cấu hình cực yếu

Replace Content, có thể dùng nó để đổi lại domain bên trong các bài viết, tìm kiếm và thay thế 1 đoạn text cụ thể

Về FastCGI Cache mặc định cho WordPress thường mình ít dùng, đa phần mình dùng Cache Rules Cloudflare hoặc FlyingPress

Bật tắt rất đơn giản bằng tùy chọn -cache=on hoặc -cache=off

# Enable Custom Cache
sudo site example.com -cache=on

# Disable Custom Cache
sudo site example.com -cache=off

Trong trường hợp lỡ xóa hoặc chưa cài đặt Memcached và Redis thì có thể cài đặt lại

sudo stack -redis
sudo stack -memcached

Reverse Proxy site là tính năng mình dùng cực nhiều trên Webinoly, thường mình sẽ kết hợp với FastCGI Cache, giúp cache các file ảnh tốt hơn

Bạn có thể xem thêm tất cả cách lệnh khác tại phần hướng dẫn của tác giả, mình chỉ liệt kê 1 số thứ hay dùng thôi

Cập nhập phiên bản Webinoly mới nhất

sudo webinoly -update

Bật SFTP

sudo webinoly -login-www-data=on

Chỉnh về múi giờ Việt Nam

timedatectl set-timezone Asia/Ho_Chi_Minh

Hạ cấp PHP xuống 7.4 (nó sẽ chậm hơn so với v8, bù lại nó tương thích với nhiều addon, plugin hơn)

sudo stack -php-ver=7.4

Xóa website khỏi hệ thống (thay example.com bằng domain bạn muốn xóa)

sudo site example.com -delete

Thông tin trang web

sudo site example.com -info

Tham khảo bibica

About Author /

Một newbie với sở thích chia sẻ những thứ xàm le học được từ internet [[=

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Comments
Mới nhất
Cũ nhất
Inline Feedbacks
View all comments

Start typing and press Enter to search