Mở đầu

Khi bạn có một VPS tương đương với việc bạn đang có một máy tính với hệ điều hành không và chưa cài đặt bất cứ phần mềm gì trong đó. Lúc đó, bạn sẽ cần phải cài đặt và cấu hình nhiều thứ để có thể deploy được một website lên đó. Bài này mình tổng hợp và trình bày cách deploy một project laravel lên VPS.

Mục tiêu của bài:

  • Cài đặt PHP, nginx, mysql, git,... phục vụ cho việc cài đặt một website.
  • Deploy thành công một laravel website sử dụng webserver nginx (không phải apache2).
  • Truy cập vào website đó từ browser trên local máy tính bằng tên domain (ví dụ daovanhung.com) chứ không phải localhost.

Lúc bạn mua VPS thì bạn nên chọn hệ điều hành ubuntu thay vì debian vì nó dễ sử dụng hơn và có nhiều tài liệu tìm kiếm hơn. Dưới đây mình trình bày cho ubuntu 16.

              deploy laravel lên unbuntu VPS sử dụng nginx, PHP7 và mysql

Truy cập vào VPS lần đầu tiên

Trước tiên bạn cần phải truy cập vào VPS để thao tác lên đó. Khi mua một VPS, nhà cung cấp sẽ đưa cho bạn password để bạn truy cập ssh vào nó.

ssh [email protected]_vps_ip

your_vps_ip là IP của VPS, bạn có thể vào control panel hoặc trong mail của nhà cung cấp gửi để lấy.

Sau khi nhập dòng lệnh trên bạn sẽ phải điền password mà nhà cung cấp đã gửi thông qua mail.

Sau khi đăng nhập lần đầu thành công thì bạn nên:

  • Update các gói phần mềm cài đặt sẵn:
apt-get update
apt-get upgrade

 

  • Đổi port mặc định của SSH thành port khác:
vi /etc/ssh/sshd_config

Tìm dòng sau và đổi port 22 thành port khác mà bạn muốn:

# What ports, IPs and protocols we listen for
Port 22

Đổi xong thì restart:

/etc/init.d/ssh restart

Bạn có thể thoát ra VPS bằng lệnh exit và truy cập lại bằng SSH theo cổng mới (truy cập mặc định theo kiểu cũ sẽ không được nữa):

ssh [email protected]_vps_ip -p NewPort

 

  • Đổi password mặc định của root thành password mong muốn của mình:
passwd root

terminal sẽ yêu cầu bạn nhập password mới.

 

  • Thêm một user vào VPS bên cạnh root để từ giờ trở đi bạn sẽ kết nối ssh bằng user này chứ không cho root có quyền truy cập ssh nữa:

Thêm user mới:

adduser daovanhung

Bạn sẽ phải nhập password cho user daovanhung.

Thiết lập cho user daovanhung có quyền sudo:

usermod -aG sudo daovanhung

Khi bạn muốn thực hiện câu lệnh nào đó mà chỉ có quyền root mới thực hiện được thì bạn gõ:

sudo your-command-line

Hoặc bạn có thể chuyển đổi sang tài khoản root để khỏi mất công gõ sudo ở đầu mỗi câu lệnh:

su root

Chặn không cho phép root truy cập VPS bằng SSH:

vi /etc/ssh/sshd_config

Tìm dòng

# Authentication: 
LoginGraceTime 120
PermitRootLogin yes 
StrictModes yes

và thay thế PermitRootLogin yes sang PermitRootLogin no.

Khởi động lại ssh:

/etc/init.d/ssh restart

 

Cài đặt các phần mềm cho VPS

Cài đặt PHP

Dưới đây là php7.1, nếu bạn muốn cài đặt php phiên bản khác chỉ cần thay thế 7.1 bằng version khác là được:

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.1
sudo apt-cache search php7.1
sudo apt-get install php7.1 php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-mysql php7.1-mbstring php7.1-mcrypt php7.1-zip php7.1-fpm php7.1-xml

Sửa file php.ini:

sudo vi /etc/php/7.1/cli/php.ini

Tìm dòng cgi.fix_pathinfo=1, uncomment nếu nó bị comment và thay thế bằng cgi.fix_pathinfo=0

Khởi động lại php:

sudo systemctl restart php7.1-fpm.service

 

Cài đặt và cấu hình nginx

Cài đặt nginx:

sudo apt-get install nginx

Thêm một website mong muốn của bạn (từ giờ mình lấy tên site là daovanhung.com làm ví dụ).

Thêm và mở file /etc/nginx/sites-available/daovanhung.com:

sudo vi /etc/nginx/sites-available/daovanhung.com

và sửa thành:

server {
        listen 80;
        listen [::]:80;

        # đường dẫn tới thư mục public/ trong project laravel
        root /your/laravel/public/folder;
        # nhớ có index.php 
        index index.php index.html index.htm index.nginx-debian.html;

        server_name daovanhung.com;

        location / {
                # ở đây phải tuyệt đối đúng nếu không paginate và route trong laravel sẽ không họat động
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                # thay bằng version php khác nếu bạn không dùng 7.1
                fastcgi_pass unix:/run/php/php7.1-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

 

Tạo file trong sites-enabled:

sudo ln -s /etc/nginx/sites-available/daovanhung.com /etc/nginx/sites-enabled/daovanhung.com

Restart nginx:

sudo systemctl restart nginx.service
#hoặc sudo nginx -s reload

 

Cài đặt mysql

sudo apt-get update
sudo apt-get install mysql-server
mysql_secure_installation

truy cập vào mysql bằng câu lệnh:

sudo -u root -p

 

Vào mysql tạo database mong muốn:

mysql -u root -p
Enter password: # nhập password

mysql> create database your_database_name;

 

Cài đặt git và clone project laravel

Cài đặt git:

sudo apt-get install git

Clone laravel project:

git clone your_laravel_project_repo_url
cd your_project

Cài đặt thư viện cho laravel:

composer install

Chạy migration nếu có:

php artisan migrate

 

Khi bạn cần import dữ liệu từ file data .sql được encode bằng UTF8 thì phải làm như sau:

File dữ liệu data.sql của bạn chỉ chứa dữ liệu chứ không chứa cấu trúc các bảng. Khi import thì gõ:

mysql -u root -p --default-character-set=utf8 your_database_name < data.sql

 

Tạo file .env và thiết lập các thông số của bạn trong file .env

APP_KEY=base64:abcdeWLPE9Xcah4d9iejjzC6g8kpxaaCxSgUfghijk=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=localhost

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_KEY=
PUSHER_SECRET=
PUSHER_APP_ID=

 

Trong những thông số trên có 3 thông số bạn phải cấu hình là DB_DATABASE, DB_USERNAME và DB_PASSWORD. DB_DATABASE đã tạo phía trên, tạo DB_USERNAME và DB_PASSWORD bằng cách:

mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'localhost' IDENTIFIED BY 'your_password';

 

Chạy các câu lệnh sau trong project laravel:

php artisan cache:clear
php artisan clear-compiled
sudo chmod -R 777 storage
chmod -R 777 bootstrap/cache/
composer dump-autoload
php artisan key:generate
php artisan optimize

 

Truy cập vps website từ browser ở local

Từ máy tính local của bạn, vào file /etc/hosts:

sudo vi /etc/hosts

Thêm dòng sau vào file trên:

your_vps_ip daovanhung.com

your_vps_ip là IP của VPS của bạn. Sau đó truy cập daovanhung.com từ browser là được.

 

Kết luận

Trên đây mình đã tổng hợp cách để cài đặt và deploy một project laravel lên VPS từ đầu. Tùy vào từng hoàn cảnh của từng project cụ thể mà có thể có các cách làm khác nhau và có thể phát sinh nhiều vấn đề khác nhau. Lúc đó bạn sẽ phải tự mình sửa hết những vấn đề đó, đặc biệt là chú ý tới các vấn đề về phân quyền.

 

Link tham khảo:

https://www.rosehosting.com/blog/install-php-7-1-with-nginx-on-an-ubuntu-16-04-vps/

https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04

https://www.a2hosting.com/kb/developer-corner/mysql/managing-mysql-databases-and-users-from-the-command-line