Trang chủ / Website / Cách Cài Đặt WordPress với LEMP trên Ubuntu 22.04

Cách Cài Đặt WordPress với LEMP trên Ubuntu 22.04

WordPress là một trong những hệ thống quản lý nội dung phổ biến nhất trên thế giới. Nó cho phép người dùng thiết lập các trang web linh hoạt bằng cách sử dụng MySQLPHP.

BetterGrowth sử dụng WordPress từ ngày đầu khởi tạo trang web, nó vẫn rất hiệu quả cho đến thời điểm tôi viết nội dung này.

Trong hướng dẫn này, bạn sẽ tập trung vào việc thiết lập một trang web WordPress với ngăn xếp LEMP trên máy chủ Ubuntu 22.04.

Chuẩn bị

Các tài nguyên và công cụ bạn cần chuẩn bị bao gồm:

Khi bạn đã sẵn sàng cho việc cài đặt, hãy đăng nhập vào máy chủ của bạn trên Terminal và thực hiện các bước dưới đây.

Bước 1: Tạo cơ sở dữ liệu và người dùng MySQL cho WordPress

WordPress sử dụng MySQL để quản lý cũng như lưu trữ thông tin trang web và người dùng.

Mặc dù bạn đã cài đặt MySQL nhưng bạn cần tạo cơ sở dữ liệu và người dùng cho WordPress để sử dụng.

Để bắt đầu, bạn hãy đăng nhập vào tài khoản root:

mysql -u root -p

Bạn sẽ được nhắc nhập mật khẩu bạn đã đặt cho tài khoản root MySQL.

Sau khi đăng nhập, bạn sẽ tạo một cơ sở dữ liệu riêng mà WordPress có thể kiểm soát.

Bạn có thể tạo cơ sở dữ liệu cho WordPress bằng cách gõ lệnh:

Lưu ý

Thay wordpress thành tên cơ sở dữ liệu của bạn.

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Tiếp theo, bạn sẽ tạo một tài khoản người dùng MySQL để hoạt động trên cơ sở dữ liệu vừa tạo của mình.

Lưu ý

Thay wordpressuserpassword thành tên người dùng MySQL của bạn và mật khẩu của nó.

CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';

Bây giờ, bạn cần cấp quyền truy cập cho người dùng vào cơ sở dữ liệu bạn đã tạo. Thực hiện câu lệnh:

GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost';

Tiếp theo, bạn cần chạy lệnh FLUSH PRIVILEGES để phiên bản hiện tại của MySQL biết về những thay đổi gần đây mà bạn đã thực hiện:

FLUSH PRIVILEGES;

Khi các tác vụ cơ sở dữ liệu đã hoàn tất, hãy thoát khỏi MySQL bằng cách gõ:

EXIT;

Bước 2: Cài đặt bổ sung các tiện ích mở rộng PHP

Khi thiết lập ngăn xếp LEMP, bạn chỉ yêu cầu một bộ tiện ích mở rộng rất tối thiểu để PHP có thể giao tiếp với MySQL.

Tuy nhiên, WordPress và nhiều plugin của nó cần thêm các tiện ích mở rộng PHP khác để có thể hoạt động.

Trước tiên, bạn chạy lệnh sau:

sudo apt update

Tiếp theo, bạn gõ lệnh sau để tải xuống và cài đặt một số tiện ích mở rộng PHP phổ biến nhất:

sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

Khi được hỏi Do you want to continue? [Y/n], bạn gõ Y và nhấn phím Enter để máy chủ thực hiện cài đặt các tiện ích mở rộng PHP đã chỉ định.

Khi bạn cài đặt xong các tiện ích mở rộng, hãy khởi động lại PHP-FPM để bộ xử lý PHP đang chạy có thể tận dụng các tính năng mới được cài đặt:

sudo systemctl restart php8.1-fpm

Bây giờ bạn đã cài đặt tất cả các tiện ích mở rộng PHP cần thiết trên máy chủ và sẵn sàng tải xuống các tệp của WordPress.

Bước 3: Tải xuống WordPress

Khi bạn cài đặt LEMP, trong quá trình cấu hình Nginx để sử dụng PHP, bạn đã tạo thư mục web gốc cho your_domain. Do đó, bạn có thể lưu trữ tệp WordPress vào thư mục này.

Trước tiên, bạn cần truy cập vào thư mục bằng cách gõ lệnh sau:

cd /var/www/your_domain

Tiếp theo, nhập lệnh sau để tải xuống phiên bản WordPress mới nhất dưới dạng tệp nén:

Lưu ý

Vì lý do bảo mật, bạn nên tải phiên bản WordPress mới nhất từ ​​trang web của họ.

curl -LO https://wordpress.org/latest.tar.gz

Ghi chú: -LO được sử dụng để truy cập trực tiếp vào nguồn của tệp nén. -L đảm bảo rằng việc tìm nạp tệp thành công trong trường hợp chuyển hướng và -O ghi đầu ra của tệp từ xa bằng một tệp cục bộ có cùng tên.

Giải nén tệp vừa tải xuống để tạo cấu trúc thư mục WordPress:

tar xzvf latest.tar.gz

Do thư mục được giải nén mặc định là wordpress sẽ nằm trong thư mục your_domain nên bạn cần chuyển các tệp trong thư mục wordpress vào thư mục your_domain theo cấu trúc trực tiếp.

Trước khi làm điều đó, bạn có thể sao chép tệp cấu hình mẫu sang tên tệp mà WordPress thực sự đọc:

cp /var/www/your_domain/wordpress/wp-config-sample.php /var/www/your_domain/wordpress/wp-config.php

Bây giờ, bạn có thể sao chép toàn bộ nội dung của thư mục wordpress vào thư mục your_domain.

Bạn sẽ sử dụng -a để đảm bảo các quyền của bạn được duy trì. Bạn cũng cần sử dụng dấu chấm ở cuối thư mục nguồn của mình để chỉ ra rằng mọi thứ trong thư mục nên được sao chép, bao gồm mọi tệp ẩn.

sudo cp -a /var/www/your_domain/wordpress/. /var/www/your_domain

Sau khi bạn sao chép các tệp thì thư mục wordpress vẫn còn tồn tại, xóa thư mục này bằng cách chạy lệnh:

rm -rf /var/www/your_domain/wordpress

Bạn cũng cần xóa tệp nén của WordPress đã tải xuống:

rm -rf /var/www/your_domain/latest.tar.gz

Tiếp theo, bạn sẽ chỉ định quyền sở hữu chúng cho người dùng và nhóm www-data (do Nginx điều hành). Sau khi chỉ định quyền, Nginx sẽ có khả năng đọc, ghi các tệp WordPress để phục vụ trang web và thực hiện cập nhật tự động.

sudo chown -R www-data:www-data /var/www/your_domain

Bây giờ, bạn cần hoàn thành một số cấu hình bổ sung cho WordPress và Nginx để trang web có thể thực sự hoạt động.

Bước 4: Thiết lập tệp cấu hình WordPress

Tệp cấu hình của WordPress có tên là wp-config.php, nó nằm trong thư mục gốc của trang web.

Bước đầu tiên của việc thiết lập, bạn sẽ điều chỉnh các khóa bí mật để cung cấp một số bảo mật cho cài đặt của bạn.

WordPress cung cấp một trình tạo an toàn cho các giá trị này, bạn không phải cố gắng để nghĩ. Chúng chỉ được sử dụng trong nội bộ, vì vậy sẽ không ảnh hưởng đến khả năng sử dụng khi có các giá trị phức tạp.

Để lấy các giá trị bảo mật từ trình tạo khóa bí mật của WordPress, bạn hãy gõ lệnh:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Mỗi khi bạn sử dụng lệnh này, WordPress sẽ trả về cho bạn một chuỗi giá trị khác nhau.

Bạn sẽ nhận lại các giá trị của riêng bạn nhưng trông giống như:

define('AUTH_KEY',         '[chuỗi ký tự]');
define('SECURE_AUTH_KEY',  '[chuỗi ký tự]');
define('LOGGED_IN_KEY',    '[chuỗi ký tự]');
define('NONCE_KEY',        '[chuỗi ký tự]');
define('AUTH_SALT',        '[chuỗi ký tự]');
define('SECURE_AUTH_SALT', '[chuỗi ký tự]');
define('LOGGED_IN_SALT',   '[chuỗi ký tự]');
define('NONCE_SALT',       '[chuỗi ký tự]');
Lưu ý

Bạn hãy sao chép các dòng trên và dán tạm vào một nơi khác. Trong các bước tiếp theo, bạn sẽ sử dụng chúng để dán vào phần cần cấu hình khóa bí mật.

Đây là những dòng cấu hình mà bạn có thể dán trực tiếp vào tệp cấu hình của mình để đặt khóa an toàn.

Bây giờ, hãy mở tệp cấu hình WordPress:

sudo nano /var/www/your_domain/wp-config.php

Tìm phần chứa các giá trị chưa được cấu hình khóa bí mật. Nó sẽ trông giống như:

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Xóa những dòng đó và dán vào các giá trị bạn đã sao chép từ dòng lệnh.

Tiếp theo, hãy sửa đổi một số cài đặt kết nối cơ sở dữ liệu ở đầu tệp. Bạn sẽ phải điều chỉnh tên cơ sở dữ liệu, người dùng cơ sở dữ liệu và mật khẩu liên quan đã được cấu hình trong MySQL.

. . .

define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'wordpressuser' );

/** MySQL database password */
define( 'DB_PASSWORD', 'password' );

. . .

Bạn cũng cần thêm define('FS_METHOD', 'direct'); vào trong tệp này để WordPress không nhắc nhập thông tin đăng nhập FTP (gồm địa chỉ IP và mật khẩu truy cập máy chủ) khi bạn thực hiện một số hành động.

Khi bạn chỉnh sửa xong, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X, sau đó gõ Y và nhấn phím ENTER để xác nhận.

Bước 5: Cấu hình Nginx

Tiếp theo, bạn sẽ thực hiện một số điều chỉnh nhỏ đối với các tệp khối máy chủ Nginx của mình.

Đầu tiên, hãy mở tệp khối máy chủ của trang web của bạn bằng cách chạy lệnh sau:

sudo nano /etc/nginx/sites-available/your_domain

Trong khối server chính, bạn cần thêm một vài khối location.

Bắt đầu bằng cách tạo các khối vị trí khớp chính xác cho các yêu cầu /favicon.ico/robots.txt.

Sao chép và dán đoạn mã sau vào tệp:

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
    expires max;
    log_not_found off;
}

Bên trong khối location / hiện có, bạn sẽ điều chỉnh danh sách try_files để quyền kiểm soát được chuyển đến tệp index.php với các đối số yêu cầu, thay vì đặt trả về lỗi 404 làm tùy chọn mặc định.

Sao chép và dán đoạn mã sau vào tệp, đồng thời thêm dấu # vào trước dòng try_files mặc định:

try_files $uri $uri/ /index.php$is_args$args;

Tại dòng root, bạn cũng cần thay đổi đường dẫn đến thư mục gốc trang web của bạn. Bạn cũng có thể thêm tên miền của bạn (bao gồm www) vào dòng server_name.

Kết quả hiển thị sau những thay đổi:

server {
listen 80;
root /var/www/your_domain;
index index.php index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;

location / {
#try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}

location ~ /\.ht {
deny all;
 }

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}

}

Khi bạn hoàn tất, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X, sau đó gõ Y và nhấn phím ENTER để xác nhận.

Bây giờ, bạn có thể chạy lệnh sau để tìm lỗi cú pháp:

sudo nginx -t

Nếu không có lỗi nào được cảnh báo, hãy tải lại Nginx bằng cách chạy lệnh:

sudo systemctl reload nginx

Bước 6: Hoàn tất cài đặt thông qua giao diện web

Trong trình duyệt web, bạn truy cập vào tên miền của mình và chọn ngôn ngữ bạn muốn sử dụng:

Truy cập giao diện web để hoàn tất cài đặt WordPress

Tiếp theo, bạn sẽ đến trang thiết lập chính.

Tại đây, bạn sẽ nhập một số thông tin quan trọng, bao gồm:

  • Tên website: Chọn tên cho trang web WordPress của bạn.
  • Tên người dùng: Là tên bạn sẽ sử dụng để đăng nhập vào trang web của mình.

Lưu ý: Bạn không nên đặt trùng với tên cơ sở dữ liệu nhằm mục đích bảo mật.

  • Mật khẩu: Là mật khẩu bạn sẽ sử dụng để đăng nhập vào trang web của mình. Mặc dù nó được tạo tự động nhưng bạn nên thay đổi thành mật khẩu của mình.

Lưu ý: Bạn không nên đặt trùng với mật khẩu tài khoản root hoặc mật khẩu đăng nhập cơ sở dữ liệu nhằm mục đích bảo mật.

  • Email của bạn: Đây là email quản trị của bạn, hãy kiểm tra kỹ địa chỉ email trước khi tiếp tục.
  • Bạn có thể không chọn “Ngăn chặn các công cụ tìm kiếm đánh chỉ mục website này”.
Cài đặt WordPress trong giao diện web

Khi bạn nhấp vào nút “Cài đặt WordPress”, bạn sẽ được đưa đến một trang nhắc bạn đăng nhập.

Tại trang đăng nhập, bạn điền “Tên người dùng” hoặc “Địa chỉ Email”, mật khẩu của bạn và nhấp vào nút “Đăng nhập”.

Sau đó, bạn sẽ được trình duyệt chuyển đến giao diện bảng điều khiển quản trị WordPress:

Bảng điều khiển WordPress

Như vậy, bạn đã hoàn tất quá trình cài đặt một trang web WordPress mới với ngăn xếp LEMP trên máy chủ Ubuntu.

Phần bổ sung

Mặc dù bạn đã cài đặt thành công một trang web WordPress nhưng để nó thực sự hoạt động tốt, bạn cần triển khai bổ sung những phần sau:

  1. Bảo mật trang web của bạn bằng chứng chỉ SSL. PositiveSSL là loại chứng chỉ yêu thích của tôi, được mua và quản lý tại Namecheap.
  2. Cài đặt bộ nhớ đệm Redis cho WordPress. Redis lưu trữ dữ liệu trong RAM nên sẽ giúp cho việc truy xuất dữ liệu của website nhanh hơn.
  3. Cấu hình Nginx để tăng bảo mật và tối ưu hiệu suất.
  4. Tăng giới hạn kích thước tệp tải lên cho WordPress.
Lưu ý

Trong bài đăng này, tôi sẽ hướng dẫn bạn cấu hình bổ sung cho Nginx và thiết lập tăng giới hạn kích thước tệp tải lên cho WordPress. Nhưng trước khi thực hiện các bước bên dưới, bạn hãy cài đặt chứng chỉ SSLbộ nhớ đệm Redis.

Cấu hình Nginx

Đầu tiên, hãy mở tệp khối máy chủ của trang web của bạn bằng cách chạy lệnh sau:

sudo nano /etc/nginx/sites-available/your_domain

Tiếp theo, bạn xóa các cấu hình hiện tại và dán đoạn mã sau vào vùng chỉnh sửa:

fastcgi_cache_path /var/run/nginx-fastcgi-cache levels=1:2 keys_zone=FASTCGICACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain;
return 301 https://$server_name$request_uri;
}

server {
listen *:443 ssl http2;
listen [::]:443 ssl http2;

ssl_certificate /etc/ssl/file_name.crt;
ssl_certificate_key /etc/ssl/private/your_domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_ecdh_curve secp384r1;
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_trusted_certificate /etc/ssl/file_name.ca-bundle;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
    	
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;

set $skip_cache 0;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
    set $skip_cache 1;
}

if ($query_string != "") {
    set $skip_cache 1;
}   

# Don't cache uris containing the following segments
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
    set $skip_cache 1;
}  

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $skip_cache 1;
}
	
# set max upload size
client_max_body_size 2G;

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
    expires max;
    log_not_found off;
}
	
location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|eot|svg|ttf|woff)$ {
    valid_referers none blocked ~.google. ~.bing. ~.yahoo. your_domain *.your_domain;
    if ($invalid_referer) {
		return 403;
	}
    gzip_static off;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    expires 30d;
    break;
}

location / {
    #try_files $uri $uri/ =404;
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;

    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    fastcgi_cache FASTCGICACHE;
    fastcgi_cache_valid 60m;
    add_header X-FastCGI-Cache $upstream_cache_status;
}

location ~ /\.ht {
    deny all;
}
	
# common nginx configuration to block sql injection and other attacks
location ~* "(eval\()" {
    deny all;
}
location ~* "(127\.0\.0\.1)" {
    deny all;
}
location ~* "([a-z0-9]{2000})" {
    deny all;
}
location ~* "(javascript\:)(.*)(\;)" {
    deny all;
}

location ~* "(base64_encode)(.*)(\()" {
    deny all;
}
location ~* "(GLOBALS|REQUEST)(=|\[|%)" {
    deny all;
}
location ~* "(<|%3C).*script.*(>|%3)" {
    deny all;
}
location ~ "(\\|\.\.\.|\.\./|~|`|<|>|\|)" {
    deny all;
}
location ~* "(boot\.ini|etc/passwd|self/environ)" {
    deny all;
}
location ~* "(thumbs?(_editor|open)?|tim(thumb)?)\.php" {
    deny all;
}
location ~* "(\'|\")(.*)(drop|insert|md5|select|union)" {
    deny all;
}
location ~* "(https?|ftp|php):/" {
    deny all;
}
location ~* "(=\\\'|=\\%27|/\\\'/?)\." {
    deny all;
}
location ~ "(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")" {
    deny all;
}
location ~ "(~|`|<|>|:|;|%|\\|\s|\{|\}|\[|\]|\|)" {
    deny all;
}
location ~* "/(=|\$&|_mm|(wp-)?config\.|cgi-|etc/passwd|muieblack)" {
    deny all;
}

location ~* "(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)" {
    deny all;
}
location ~* "/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell|config|settings|configuration)\.php" {
    deny all;
}

# Deny backup extensions & log files and return 403 forbidden
location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
    deny all;
}

# Return 403 forbidden for readme.(txt|html) or license.(txt|html) or example.(txt|html) or other common git repository files
location ~*  "/(^$|readme|license|example|README|LEGALNOTICE|INSTALLATION|CHANGELOG)\.(txt|html|md)" {
    deny all;
}

location /.well-known/acme-challenge/ {
    alias /var/www/html/.well-known/acme-challenge/;
}

location ~ /\.DS {
    deny all;
}

# Cache css & js files
location ~* \.(?:css(\.map)?|js(\.map)?)$ {
    add_header "Access-Control-Allow-Origin" "*";
    access_log off;
    log_not_found off;
    expires 30d;
}

# CSS and Javascript send expires headers.
location ~* \.(?:css|js)$ {
    expires 1y;
    access_log off;
    add_header Cache-Control "public";
}

# HTML send expires headers.
location ~* \.(html)$ {
    expires 7d;
    access_log off;
    add_header Cache-Control "public";
}

# WordPress: deny wp-content, wp-includes php files
location ~* ^/(?:wp-content|wp-includes)/.*\.php$ {
    deny all;
}

# WordPress: deny wp-content/uploads nasty stuff
location ~* ^/wp-content/uploads/.*\.(?:s?html?|php|js|swf)$ {
    deny all;
}

# WordPress: deny general stuff
location ~* ^/(?:xmlrpc\.php|wp-links-opml\.php|wp-config\.php|wp-config-sample\.php|wp-comments-post\.php|readme\.html|license\.txt)$ {
    deny all;
}

location ~ /\.user.ini {
    deny all;
    access_log off;
    log_not_found off;
}


# Deny access to uploads that aren’t images, videos, music, etc.
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php|js|swf)$ {
    deny all;
}


# Deny backup extensions & log files
location ~* ^.+\.(bak|log|old|orig|original|php#|php~|php_bak|save|swo|swp|sql)$ {
    deny all;
    access_log off;
    log_not_found off;
}

location ~ /\.(svn|git)/* {
    deny all;
    access_log off;
    log_not_found off;
}

location ~* /(?:uploads|files|wp-content|wp-includes|akismet)/.*.php$ {
    deny all;
    access_log off;
    log_not_found off;
}

# Stop scann for the follow files on plugins folder
location ~* ^/wp-content/plugins/.+\.(txt|log|md)$ {
    deny all;
    error_page 403 =404 / ;
}

# Stop scann for the follow files on themes folder
location ~* ^/wp-content/themes/.+\.(txt|log|md)$ {
    deny all;
    error_page 403 =404 / ;
}

# nginx block wpscann on plugins folder
location ~* ^/wp-content/plugins/.+\.(txt|log|md)$ {
    deny all;
    error_page 403 =404 / ;
}

# block access to install.php and upgrade.php
location ^~ /wp-admin/install.php {
    deny all;
    error_page 403 =404 / ;
}

location ^~ /wp-admin/upgrade.php {
    deny all;
    error_page 403 =404 / ;
}

#Disable execution of scripts other than PHP from your document root
location ~* .(pl|cgi|py|sh|lua|asp)$ {
    return 444;
}

#Disable access to your configuration files and other files that you don’t want to users are able to see
location ~* /(wp-config.php|readme.html|license.txt|nginx.conf) {
    deny all;
}

# Disable wp-config.txt
location = /wp-config.txt {
    deny all;
    access_log off;
    log_not_found off;
}

# enables GZIP compression
gzip on; 

# compression level (1-9)
# 6 is a good compromise between CPU usage and file size
gzip_comp_level 6;

# minimum file size limit in bytes to avoid negative compression outcomes
gzip_min_length 256;

# compress data for clients connecting via proxies
gzip_proxied any;

# directs proxies to cache both the regular and GZIP versions of an asset
gzip_vary on;

# disables GZIP compression for ancient browsers that don't support it
gzip_disable "msie6";

# compress outputs labeled with the following file extensions or MIME-types
# text/html MIME-type is enabled by default and need not be included
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/vnd.ms-fontobject
application/wasm
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/bmp
image/svg+xml
text/cache-manifest
text/calendar
text/css
text/javascript
text/markdown
text/plain
text/xml
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;

# sets the 'number' and 'size' of buffers for GZIP compression
# default buffer size is 4K or 8K depending on the platform
gzip_buffers 16 8k;
}

Khi bạn hoàn tất, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X, sau đó gõ Y và nhấn phím ENTER để xác nhận.

Sau đó, hãy mở tệp nginx.conf bằng cách chạy lệnh sau:

sudo nano /etc/nginx/nginx.conf

Tiếp theo, bạn xóa các cấu hình hiện tại và dán đoạn mã sau vào vùng chỉnh sửa:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
}

http {

# Basic Settings
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;

# SSL Settings
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

# Logging Settings
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

# Gzip Settings
gzip on;

# Virtual Host Configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

Khi bạn hoàn tất, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X, sau đó gõ Y và nhấn phím ENTER để xác nhận.

Bây giờ, bạn có thể chạy lệnh sau để tìm lỗi cú pháp:

sudo nginx -t

Nếu không có lỗi nào được cảnh báo, hãy tải lại Nginx bằng cách chạy lệnh:

sudo systemctl reload nginx

Tăng giới hạn kích thước tệp tải lên

Đầu tiên, hãy mở tệp php.ini bằng cách chạy lệnh sau:

sudo nano /etc/php/8.1/fpm/php.ini

Tại các dòng upload_max_filesizepost_max_size trong vùng chỉnh sửa, bạn thay các giá trị mặc định tương ứng thành 128M và 200M.

Lưu ý

Khi bạn tăng giới hạn kích thước tệp tải lên cho WordPress, bạn cần điều chỉnh giá trị của client_max_body_size trong cấu hình Nginx. Trong phần cấu hình Nginx được tôi đề cập ở trên đã bao gồm client_max_body_size 2G;. Đối với các tệp rất lớn, bạn có thể cần thay đổi giá trị của thông số client_body_timeout (mặc định là 60s).

Khi bạn chỉnh sửa xong, hãy khởi động lại PHP-FPM:

sudo systemctl restart php8.1-fpm

Tạm kết

39% website trên toàn thế giới sử dụng WordPress và ngày càng phát triển. Đó là lý do tôi đi cùng với nền tảng mã nguồn mở này trong nhiều năm qua.

Mặc dù máy chủ ảo có hiệu suất mạnh mẽ nhưng nó cũng đòi hỏi người dùng cần có kiến thức về kỹ thuật để triển khai.

Tuy nhiên khi áp dụng từng bước trong bài đăng này, bạn hoàn toàn có thể tự cài đặt một trang web WordPress trên máy chủ Ubuntu.

Về tác giả Phạm Đình Quân

Phạm Đình Quân là người sáng lập BetterGrowth, và hiện đang là Head of Digital Execution tại Vingroup. Anh ấy có gần 10 năm kinh nghiệm, từng quản lý đội ngũ marketing hơn 60 nhân sự, yêu thích việc chia sẻ bằng kiến thức và kinh nghiệm dày dặn của mình.
Tìm hiểu thêm

Viết một bình luận