Cài đặt Nginx, PHP 8.0, WordPress và MySQL trên Ubuntu
Contents
Cài đặt Nginx
Nginx đã trở thành phần mềm máy chủ web phổ biến nhất được sử dụng trên các máy chủ Linux, vì vậy bạn nên sử dụng nó hơn là Apache. Mặc dù kho lưu trữ gói chính thức của Ubuntu bao gồm các gói Nginx, nhưng chúng thường rất lỗi thời. Thay vào đó, tôi thích sử dụng kho lưu trữ gói do Ondřej Surý duy trì, bao gồm các gói ổn định Nginx mới nhất.
Đầu tiên, thêm kho lưu trữ và cập nhật danh sách gói:
sudo add-apt-repository ppa:ondrej/nginx -y
sudo apt update
Hiện tại có thể có một số gói có thể được nâng cấp, hãy làm điều đó ngay bây giờ:
sudo apt dist-upgrade -y
Sau đó cài đặt Nginx:
sudo apt install nginx -y
Sau khi hoàn tất, bạn có thể xác nhận rằng Nginx đã được cài đặt bằng lệnh sau:
nginx -v
ashley@pluto:~$ nginx -v
nginx version: nginx/1.20.0
Ngoài ra, khi truy cập Tên miền Đủ điều kiện (FQDN) trỏ đến địa chỉ IP máy chủ của bạn trong trình duyệt, bạn sẽ thấy trang chào mừng Nginx.
Chào mừng đến nginx
Bây giờ Nginx đã được cài đặt thành công, đã đến lúc thực hiện một số cấu hình cơ bản. Nginx mới ra mắt được tối ưu hóa khá tốt, nhưng cần thực hiện một số điều chỉnh cơ bản. Tuy nhiên, trước khi mở tệp cấu hình, bạn cần xác định số lượng lõi CPU của máy chủ và giới hạn tệp đang mở.
Nhập lệnh sau để nhận số lõi CPU mà máy chủ của bạn có sẵn. Hãy ghi lại con số vì chúng ta sẽ sử dụng nó sau một phút:
grep processor /proc/cpuinfo | wc -l
Chạy phần sau để nhận giới hạn tệp mở của máy chủ của bạn và lưu ý, chúng tôi cũng cần nó:
ulimit -n
Tiếp theo, mở tệp cấu hình Nginx, có thể tìm thấy tại /etc/nginx/nginx.conf:
sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
Tôi sẽ không liệt kê mọi chỉ thị cấu hình nhưng tôi sẽ đề cập ngắn gọn đến những chỉ thị mà bạn nên thay đổi. Nếu bạn muốn xem toàn bộ nội dung cùng một lúc dễ dàng hơn, vui lòng tải xuống bộ cấu hình Nginx hoàn chỉnh ngay bây giờ.
Bắt đầu bằng cách đặt người dùng thành tên người dùng mà bạn hiện đang đăng nhập. Điều này sẽ làm cho việc quản lý quyền đối với tệp dễ dàng hơn nhiều trong tương lai, nhưng điều này chỉ được chấp nhận về mặt bảo mật khi chạy một máy chủ truy cập người dùng duy nhất.
Chỉ thị worker_processes xác định số lượng công nhân sẽ xuất hiện trên mỗi máy chủ. Nguyên tắc chung là đặt điều này thành số lõi CPU mà máy chủ của bạn có sẵn. Trong trường hợp của tôi, đây là 1.
Khối sự kiện chứa hai chỉ thị, worker_connections đầu tiên phải được đặt thành giới hạn tệp đang mở của máy chủ của bạn. Điều này cho Nginx biết có bao nhiêu kết nối đồng thời có thể được mở bởi mỗi worker_process. Do đó, nếu bạn có hai lõi CPU và giới hạn tệp mở là 1024, máy chủ của bạn có thể xử lý 2048 kết nối mỗi giây. Tuy nhiên, số lượng kết nối không tương đương trực tiếp với số lượng người dùng mà máy chủ có thể xử lý, vì phần lớn các trình duyệt web mở ít nhất hai kết nối cho mỗi yêu cầu. Chỉ thị multi_accept nên được bỏ ghi chú và được đặt thành bật. Điều này thông báo cho mỗi worker_process chấp nhận tất cả các kết nối mới tại một thời điểm, trái ngược với việc chấp nhận một kết nối mới tại một thời điểm.
Di chuyển xuống tệp bạn sẽ thấy khối http. Chỉ thị đầu tiên cần thay đổi là keepalive_timeout theo mặc định được đặt thành 65. keepalive_timeout xác định bao nhiêu giây một kết nối với máy khách nên được giữ mở trước khi đóng bởi Nginx. Chỉ thị này nên được hạ xuống vì bạn không muốn các kết nối không hoạt động ở đó trong tối đa 65 giây nếu chúng có thể được sử dụng bởi các máy khách mới. Tôi đã đặt của tôi thành 15.
Vì lý do bảo mật, bạn nên bỏ ghi chú chỉ thị server_tokens và đảm bảo nó được đặt thành tắt. Điều này sẽ vô hiệu hóa việc phát ra số phiên bản Nginx trong thông báo lỗi và tiêu đề phản hồi.
Bên dưới server_tokens thêm chỉ thị client_max_body_size và đặt điều này thành kích thước tải lên tối đa mà bạn yêu cầu trong Thư viện phương tiện WordPress. Tôi đã chọn giá trị là 64m.
Đi sâu xuống khối http, bạn sẽ thấy một phần dành riêng cho nén gzip. Theo mặc định, gzip được bật nhưng bạn nên tinh chỉnh thêm các giá trị này để xử lý các tệp tĩnh tốt hơn. Đầu tiên, bạn nên bỏ ghi chú chỉ thị gzip_proxied và đặt nó thành bất kỳ, điều này sẽ đảm bảo tất cả các phản hồi yêu cầu được ủy quyền đều được nén. Thứ hai, bạn nên bỏ ghi chú gzip_comp_level và đặt nó thành giá trị 5. Điều này kiểm soát mức độ nén của phản hồi và có thể có giá trị trong khoảng 1 – 9. Hãy cẩn thận không đặt giá trị này quá cao vì nó có thể có tác động tiêu cực đến việc sử dụng CPU. Cuối cùng, bạn nên bỏ ghi chú chỉ thị gzip_types, để nguyên các giá trị mặc định. Điều này sẽ đảm bảo rằng JavaScript, CSS và các loại tệp khác được nén cùng với loại tệp HTML.
Đó là cấu hình Nginx cơ bản được xử lý. Nhấn CTRL + X, sau đó nhấn Y để lưu các thay đổi.
Để Nginx phân phối chính xác PHP, bạn cũng cần đảm bảo chỉ thị fastcgi_param SCRIPT_FILENAME được đặt, nếu không bạn sẽ nhận được màn hình trắng trống khi truy cập bất kỳ tập lệnh PHP nào. Mở tệp fastcgi_params:
sudo nano /etc/nginx/fastcgi_params
Đảm bảo rằng chỉ thị sau tồn tại, nếu không thêm nó vào tệp:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Để lưu tệp fastcgi_params, nhấn CTRL + X, sau đó nhấn Y.
Bạn phải khởi động lại Nginx để các thay đổi có hiệu lực. Trước khi làm như vậy, hãy đảm bảo rằng các tệp cấu hình không có lỗi bằng cách phát hành lệnh sau:
sudo nginx -t
Nếu mọi thứ đều ổn, hãy tiếp tục và khởi động lại Nginx:
sudo service nginx restart
ashley@pluto:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ashley@pluto:~$ sudo service nginx restart
* Restarting nginx [ OK ]
ashley@pluto:~$
Cài đặt PHP 8.0
Cũng giống như với Nginx, kho lưu trữ gói chính thức của Ubuntu có chứa các gói PHP. Tuy nhiên, chúng không phải là cập nhật nhất. Một lần nữa, tôi sử dụng một cái do Ondřej Surý duy trì để cài đặt PHP. Thêm kho lưu trữ và cập nhật danh sách gói như bạn đã làm cho Nginx:
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
Sau đó cài đặt PHP 8.0, cũng như tất cả các gói PHP mà bạn sẽ yêu cầu:
sudo apt install php8.0-fpm php8.0-common php8.0-mysql \
php8.0-xml php8.0-xmlrpc php8.0-curl php8.0-gd \
php8.0-imagick php8.0-cli php8.0-dev php8.0-imap \
php8.0-mbstring php8.0-opcache php8.0-redis \
php8.0-soap php8.0-zip -y
Bạn sẽ nhận thấy php-fpm trong danh sách các gói đang được cài đặt. FastCGI Process Manager (FPM) là một triển khai PHP FastCGI thay thế với một số tính năng bổ sung hoạt động thực sự tốt với Nginx. Đó là trình quản lý quy trình được khuyến nghị sử dụng khi cài đặt PHP với Nginx.
Sau khi quá trình cài đặt hoàn tất, hãy xác nhận rằng PHP đã được cài đặt chính xác:
php-fpm8.0 -v
ashley@pluto:~$ php-fpm8.0 -v
PHP 8.0.13 (fpm-fcgi) (built: Nov 22 2021 09:50:43)
Copyright (c) The PHP Group
Zend Engine v4.0.13, Copyright (c) Zend Technologies
with Zend OPcache v8.0.13, Copyright (c), by Zend Technologies
Định cấu hình PHP 8.0 và PHP-FPM
Khi Nginx và PHP được cài đặt, bạn cần phải định cấu hình người dùng và nhóm mà dịch vụ sẽ chạy. Như đã đề cập trong phần giới thiệu loạt bài, thiết lập này không cung cấp cách ly bảo mật giữa các trang web bằng cách định cấu hình nhóm PHP, vì vậy chúng tôi sẽ chạy một nhóm PHP duy nhất trong tài khoản người dùng của bạn. Nếu cần cách ly bảo mật giữa các trang web, chúng tôi khuyên bạn không nên sử dụng phương pháp này mà thay vào đó hãy sử dụng SpinupWP để cung cấp máy chủ của bạn.
Mở tệp cấu hình nhóm mặc định:
sudo nano /etc/php/8.0/fpm/pool.d/www.conf
Thay đổi các dòng sau, thay thế dữ liệu www bằng tên người dùng của bạn:
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
Tiếp theo, bạn nên điều chỉnh tệp php.ini của mình để tăng kích thước tải lên tối đa của WordPress. Cả chỉ thị này và chỉ thị client_max_body_size trong Nginx đều phải được thay đổi để giới hạn tải lên tối đa mới có hiệu lực. Mở tệp php.ini của bạn:
sudo nano /etc/php/8.0/fpm/php.ini
Thay đổi các dòng sau để khớp với giá trị bạn đã gán cho chỉ thị client_max_body_size khi định cấu hình Nginx:
upload_max_filesize = 64M
post_max_size = 64M
Nhấn CTRL + X và Y để lưu cấu hình. Trước khi khởi động lại PHP, hãy kiểm tra xem cú pháp tệp cấu hình có đúng không:
sudo php-fpm8.0 -t
ashley@server:~$ sudo php-fpm8.0 -t
[09-May-2021 09:07:00] NOTICE: configuration file /etc/php/8.0/fpm/php-fpm.conf test is successful
Nếu kiểm tra cấu hình thành công, hãy khởi động lại PHP bằng lệnh sau:
sudo service php8.0-fpm restart
Bây giờ Nginx và PHP đã được cài đặt, bạn có thể xác nhận rằng cả hai đều đang chạy dưới quyền người dùng bằng cách ra lệnh htop:
htop
Nếu bạn nhấn SHIFT + M, đầu ra sẽ được sắp xếp theo mức sử dụng bộ nhớ, điều này sẽ hiển thị các quy trình nginx và php-fpm8.0. Bạn sẽ nhận thấy một vài lần xuất hiện của cả nginx và php-fpm.
Cả hai quy trình sẽ có một phiên bản chạy dưới người dùng root. Đây là quá trình chính sinh ra từng công nhân. Phần còn lại sẽ chạy dưới tên người dùng bạn đã chỉ định.
top - 08:55:43 up 29 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 97 total, 1 running, 94 sleeping, 2 stopped, 0 zombie
%Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 981.2 total, 528.4 free, 129.4 used, 323.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 700.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
676 root 20 0 241232 35892 29620 S 0.0 3.6 0:00.11 php-fpm8.0
680 root 20 0 630404 28408 15544 S 0.0 2.8 0:00.58 snapd
675 root 20 0 29272 17952 10292 S 0.0 1.8 0:00.04 networkd-dispat
341 root 19 -1 51464 13312 12308 S 0.0 1.3 0:00.11 systemd-journal
760 ashley 20 0 241608 12916 6616 S 0.0 1.3 0:00.00 php-fpm8.0
761 ashley 20 0 241608 12916 6616 S 0.0 1.3 0:00.00 php-fpm8.0
888 root 20 0 13796 8916 7472 S 0.0 0.9 0:00.00 sshd
863 root 20 0 12176 7408 6484 S 0.0 0.7 0:00.00 sshd
566 systemd+ 20 0 90228 6056 5292 S 0.0 0.6 0:00.03 systemd-timesyn
998 ubuntu 20 0 13928 5992 4528 S 0.0 0.6 0:00.45 sshd
1096 ashley 20 0 58988 5596 3756 S 0.0 0.6 0:00.00 nginx
Nếu không, hãy quay lại và kiểm tra cấu hình và đảm bảo rằng bạn đã khởi động lại cả dịch vụ Nginx và PHP-FPM.
Kiểm tra Nginx và PHP
Để kiểm tra xem Nginx và PHP có hoạt động cùng nhau không, hãy bật PHP trong cấu hình trang web Nginx mặc định và tạo tệp thông tin PHP để xem trong trình duyệt của bạn. Bạn có thể bỏ qua bước này, nhưng thường rất hữu ích khi kiểm tra xem các tệp PHP có thể được máy chủ web Nginx xử lý chính xác hay không.
Trước tiên, bạn cần bỏ ghi chú một phần trong cấu hình trang web Nginx mặc định được tạo khi bạn cài đặt Nginx:
sudo nano /etc/nginx/sites-available/default
Tìm phần điều khiển các tập lệnh PHP.
# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/run/php/php8.0-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
Vì chúng tôi đang sử dụng php-fpm, chúng tôi có thể thay đổi phần đó thành như thế này:
# pass PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
}
Lưu tệp bằng cách sử dụng CTRL + X theo sau là Y. Sau đó, như trước đây, hãy kiểm tra để đảm bảo rằng tệp cấu hình đã được chỉnh sửa chính xác.
sudo nginx -t
Nếu mọi thứ có vẻ ổn, hãy tiếp tục và khởi động lại Nginx:
sudo service nginx restart
Tiếp theo, tạo một tệp info.php trong thư mục gốc của web mặc định, đó là / var / www / html.
cd /var/www/html
sudo nano info.php
Thêm mã PHP sau vào tệp info.php đó và lưu nó bằng cách sử dụng cùng một tổ hợp CTRL + X, Y.
<?php
phpinfo();
?>
Cuối cùng, vì bạn đặt chỉ thị người dùng trong tệp nginx.conf của mình cho người dùng mà bạn hiện đang đăng nhập, hãy cấp cho người dùng đó quyền đối với tệp info.php.
sudo chown ubuntu info.php
Bây giờ, nếu bạn truy cập tệp info.php trong trình duyệt của mình, sử dụng FQDN mà bạn đã thiết lập trong chương 1, bạn sẽ thấy màn hình thông tin PHP, có nghĩa là Nginx có thể xử lý tệp PHP một cách chính xác.
Màn hình thông tin PHP.
Khi bạn đã kiểm tra điều này, bạn có thể tiếp tục và xóa tệp info.php.
sudo rm /var/www/html/info.php