Hướng dẫn deploy dự án laravel lên vps sử dụng centos 9. Trong bài viết này chúng ta sẽ liệt kê các bước để deploy dự án laravel lên môi trường centos 9.
Đầu tiên cần ssh vào server để cài đặt, tham khảo bài viết cấu hình ssh config
Kiểm tra thông tin server
cat /etc/os-release
# Ouput
NAME="CentOS Stream"
VERSION="9"
Cài đặt git để clone code về server
// Update your system
sudo dnf update
// Install git
sudo dnf install git
// Check version
git --version
git version 2.39.3
Thêm ssh key của server vào tài khoản github
// Generate ssh key
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "nguyenhuu140490@gmail.com"
chmod -R 600 id_rsa.pub
// ssh-agent in the background
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
Thêm ssh public key vào tài khoản github
cat ~/.ssh/id_rsa.pub
// Check server connect with git
ssh -T git@github.com
// Ouput success
Hi nguyenhuu1404! You've successfully authenticated, but GitHub does not provide shell access.
clone code từ github về server
// Add user to root group
sudo usermod -aG root [your_user]
// Create workspace
sudo mkdir /var/www/html
// Change owner for workspace
sudo chown -R [your_user]:[your_user] html
// VD user access server là centos
sudo chown -R centos:centos html
// Clone code
cd /var/www/html
git clone [repo_url]
Cài nginx web server
sudo dnf update
// Install nginx
sudo dnf install nginx
// Check version
nginx --version
nginx version: nginx/1.20.1
// Start nginx service
sudo systemctl start nginx
sudo systemctl enable nginx
// Check nginx status
sudo systemctl status nginx
// Mở post tường lửa để sử dụng nginx
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Cài đặt php 8.2 do chúng ta sử dụng laravel 10
// Install the EPEL repository
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
// Install the Remi repository
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
// List php version
dnf module list php
// Install PHP 8.2 via the remi repository
dnf module install php:remi-8.2
// Check php version
php -v
// Output
PHP 8.2.0 (cli) (built: Dec 6 2022 14:26:47) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.0, Copyright (c) Zend Technologies
Cài đặt các extension cho php 8.2
// Cài đặt các extension cho php nếu sử dụng mysql
dnf install php-fpm php php-bcmath php-cli php-common php-gd php-imap php-mbstring php-mcrypt php-mysql php-mysqlnd php-pdo php-soap php-tidy php-xml php-xmlrpc php-opcache php-redis php-pecl-mcrypt php-brotli
// Cài đặt các extension cho php nếu sử dụng postgreSql
sudo dnf install php-fpm php php-bcmath php-cli php-common php-gd php-imap php-mbstring php-mcrypt php-pgsql php-soap php-tidy php-xml php-xmlrpc php-opcache php-redis php-pecl-mcrypt php-brotli
Start php-fpm
// Start php-fpm
systemctl enable php-fpm
systemctl start php-fpm
// Stop php fpm
systemctl stop php-fpm
// Restart php fpm
systemctl restart php-fpm
// Status php fpm
systemctl status php-fpm
// Back up config php fpm
sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak
Thay đổi config cho php fpm
sudo vim /etc/php-fpm.d/www.conf
# Make the following modifications.
# Sửa user group mặc định sang user mà bạn đănng nhập vps
# VD user của mình là centos
user =centos
group = centos
listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
listen.owner = centos
listen.group = centos
listen.mode = 0660
// Restart php fpm
systemctl restart php-fpm
Thêm file config nginx php-fpm
vi /etc/nginx/conf.d/default.conf
server {
listen 80;
root /var/www/html/demo/public;
server_name demo.com;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
access_log /var/log/nginx/demo-access.log;
error_log /var/log/nginx/demo-error.log;
index index.php;
charset utf-8;
# Setting basic auth
location / {
# auth_basic "Authorized personnel only.";
# auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Như vậy là chúng ta đã cài đặt xong nginx và php fpm
Chúng ta sẽ dùng postgreSql 14 và giờ hãy cài nó
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
// Disable the built-in PostgreSQL module
sudo dnf -qy module disable postgresql
// Update system
sudo dnf update -y
// Install postgreSql 14
sudo dnf install -y postgresql14-server
// Start and enable the PostgreSQL server
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
// Access db
sudo -i -u postgres psql
// Check connect
postgres=# \conninfo
// Check version
postgres=# SELECT version();
// Exist connect
postgres=# \q
Tạo user, password access db
// Create users
sudo -i -u postgres createuser demo
// Create password for user
sudo -i -u postgres psql
ALTER USER technixleo PASSWORD 'demo';
ALTER ROLE
// Quit the shell
\q
Create database
sudo -i -u postgres
// Create a database
createdb application
// Access db
psql application
// Access db từ server
psql -h localhost -p 5432 -U [user] [db_name]
psql -h localhost -p 5432 -U demo application
Thêm config vào file .env
để conect db
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=application
DB_USERNAME=demo
DB_PASSWORD=demo
Cài đặt composer
dnf install php
dnf -y install wget
wget https://getcomposer.org/installer -O composer-installer.php
php composer-installer.php --filename=composer --install-dir=/usr/local/bin
// Check composer
composer --version
// Install packagist for laravel
cd /var/www/html/demo
composer install
Cài đặt nvm và node verison 18
sudo dnf update -y
sudo dnf groupinstall "Development Tools" -y
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc
// Check version nvm
nvm --version
// List node version
nvm install --lts
// Install node 18
nvm install 18.16.0
nvm use 18.16.0
// Check node version
node -v
Cài đặt suppervisor
sudo yum install epel-release
sudo yum install supervisor
Sửa lại file config cho suppervisor từ file .ini
sang file .conf
cho giống document của laravel
vi /etc/supervisord.conf
[include]
files = supervisord.d/*.ini
// change file config
[include]
files = supervisord.d/*.conf
Thêm file laravel-worker.conf
config giám sát queue của laravel
vi /etc/supervisord.d/laravel-worker.conf
// Input
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/demo/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
;user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/html/sales-dx-34/closb-app/storage/logs/worker.log
stopwaitsecs=3600
Khởi động suppervisor
sudo systemctl enable supervisord
sudo systemctl start supervisord
// Check status
sudo supervisorctl status
// Restart suppervisord
sudo systemctl restart supervisord
// Update code when deploy
php artisan queue:restart
Cài đặt crontabs để run schedule
sudo dnf update
sudo dnf install crontabs
// Start cron
sudo systemctl start crond.service
sudo systemctl enable crond.service
Thêm crontab run chedule laravel
contab -e
// Input
* * * * * cd /var/www/html/demo && php artisan schedule:run >> /dev/null 2>&1
// Check crontab
crontab -l
Cài đặt certbot để đăng kí ssl miễn phí. Trước tiên chúng ta sẽ cài đặt snapd
// Installing and start snapd
dnf install epel-release
dnf install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
snap install core;
Cài đặt cerbot bằng snapd
dnf remove certbot
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
Đăng kí ssl bằng command
sudo certbot --nginx
// Ouput
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: demo.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
Command trên sẽ tự động check các server name trong các file config nginx. sau đó chọn domain muốn đăng kí ssl làm theo các step của command là xong. Command sẽ tự động tại file ssl và thêm vào file config nginx cho chúng ta.
cat /etc/nginx/conf.d/default.conf
server {
root /var/www/html/demo/public;
server_name demo.com;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
access_log /var/log/nginx/demo-access.log;
error_log /var/log/nginx/demo-error.log;
index index.php;
charset utf-8;
location / {
# auth_basic "Authorized personnel only.";
# auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/demo.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/demo.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = demo.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name demo.com
return 404; # managed by Certbot
}
Khởi động lại nginx là chúng ta đã đăng kí ssl thành công
systemctl restart nginx
Gia hạn ssl
certbot renew --dry-run
Update email register ssl by document
// Create email
sudo certbot register --email example@gmail.com
// Update email
sudo certbot update_account --email example@gmail.com
Như vậy là chúng ta đã cài đặt xong các service để deploy dự án laravel lên môi trường centos 9. Thanks for reading...
Nguồn tham khảo:
Install nginx:
https://unixcop.com/how-to-install-nginx-on-centos-9-stream
Install php 8.2:
https://wiki.crowncloud.net/?How_to_Install_PHP_8_2_in_CentOS_9_Stream
https://techviewleo.com/install-php-8-on-centos-stream-centos-stream
Install postgreSql 14:
https://technixleo.com/install-postgresql-on-centos-alma-rhel-9
Install certbot:
https://serverspace.io/support/help/setup-lets-encrypt-ssl-nginx-on-centos-8
Install supervisor:
https://www.linode.com/docs/guides/how-to-install-and-configure-supervisor-on-centos-8