Cách cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04 (LEMP)

Lượt xem
Home

Laravel là một framework PHP mã nguồn mở cung cấp một bộ công cụ và tài nguyên để xây dựng các ứng dụng PHP hiện đại. Laravel ngày càng trở nên phổ biến trong những năm vừa qua và được nhiều nhà phát triển lựa chọn làm framework cho quá trình phát triển tối ưu hóa. Bài viết dưới đây của Vietnix sẽ hướng dẫn bạn cách cài đặt và cấu hình Laravel trên Ubuntu 20.04 với Nginx. Sau khi hoàn thành, bạn sẽ có một ứng dụng Laravel kết nối với cơ sở dữ liệu MySQL 8.

Yêu cầu chuẩn bị để cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04

Để thực hiện quá trình cài đặt theo hướng dẫn dưới đây, trước hết bạn cần chuẩn bị một số yêu cầu sau đây đối với máy chủ Ubuntu 20.04:

  • Tạo một user sudo và kích hoạt ufw
  • Cài đặt LEMP stack với MySQL8.
  • Cài đặt Composer. Quá trình cài đặt sẽ sử dụng Composer để cài đặt Laravel và các dependency. (Bài viêt hướng dẫn cách cài đặt Composer trên Ubuntu 20.04 tại đây)
LEMP stack
LEMP stack

Các bước cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04

Sau khi đã hoàn thiện các bước chuẩn bị cho máy chủ Ubuntu 20.04, bạn tiến hành cài đặt và cấu hình Laravel với Nginx theo các bước dưới đây.

Bước 1: Cài đặt các module PHP cần thiết

Trước khi cài đặt Laravel, bạn cần cài đặt một số module PHP được yêu cầu bởi framework. Sử dụng apt để cài đặt các module php-mbstring, php-xml, php-bcmath. Những phần mở rộng này được cung cấp bổ sung cho việc xử lý mã hóa ký tự, XML và phép toán cao cấp. 

Nếu đây là lần đầu sử dụng apt trong phiên làm việc, bạn cần chạy lệnh update trước để cập nhật cache gói quản lý:

$ sudo apt update

Sau đó, bạn có thể bắt đầu cài đặt các gói cần thiết với câu lệnh:

$ sudo apt install php-mbstring php-xml php-bcmath

Hệ thống đã sẵn sàng để cài đặt Laravel thông qua Composer. Tuy nhiên trước khi tiến hành cài đặt, bạn cần tạo một cơ sở dữ liệu cho ứng dụng, hãy theo dõi tiếp ở bước sau.

Bước 2: Tạo cơ sở dữ liệu cho ứng dụng

Để thực hiện cài đặt và sử dụng Laravel, bạn cần tạo ứng dụng travel list hiển thị danh sách những nơi người dùng muốn tìm đến và danh sách các nơi mà họ thực tế đã đến. Các thông tin này có thể được lưu trữ trong places table với một trường cho vị trí, được gọi là name và một trường đánh dấu visited hay not vistied. Bên cạnh đó, bạn cần một trường id để xác định tính duy nhất của mỗi mục.

Để kết nối đến cơ sở dữ liệu từ ứng dụng Laravel, bạn cần tạo một MySQL user riêng biệt và cấp quyền đầy đủ cho user này trên cơ sở dữ liệu travellist.

Bạn cần phải thiết lập database user với phương thức xác thực mysql_native_password để có thể kết nối với cơ sở dữ liệu MySQL PHP.

Để bắt đầu, hãy đăng nhập vào MySQL console với tài khoản root của cơ sở dữ liệu bằng lệnh sau:

$ sudo mysql

Để tạo một cơ sở dữ liệu mới, hãy chạy câu lệnh sau từ MySQL console:

mysql> CREATE DATABASE travellist;

Bây giờ bạn có thể tạo một user mới và cấp quyền đầy đủ trên cơ sở dữ liệu tùy chỉnh mà bạn vừa tạo. Ví dụ dưới đây đang tạo một user có tên travellist_user với mật khẩu password. Tuy nhiên bạn nên thay đổi mật khẩu của riêng mình để bảo đảm độ an toàn:

mysql> CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Thực hiện cấp quyền cho user trên cơ sở dữ liệu travellist bằng câu lệnh sau:

mysql> GRANT ALL ON travellist.* TO 'travellist_user'@'%';

Điều này sẽ cung cấp cho travellist_user toàn quyền trên cơ sở dữ liệu travellist đồng thời ngăn chặn user này tạo hoặc sửa đổi các cơ sở dữ liệu khác trên máy chủ.

Sau khi thực hiện xong, tiến hành thoát khỏi MySQL shell:

mysql> exit

Để kiểm tra lại xem user đã được cấp đầy đủ quyền truy cập hay chưa, bạn có thể đăng nhập lại vào MySQL console và sử dụng thông tin đăng nhập của người dùng tùy chỉnh:

mysql -u travellist_user -p

Lưu ý flag -p trong câu lệnh này yêu cầu bạn nhập mật khẩu được sử dụng khi tạo travellist_user. Sau khi đăng nhập vào MySQL console, hãy xác nhận rằng bạn có quyền truy cập vào cơ sở dữ liệu travellist.

mysql> SHOW DATABASES;

Kết quả trả về như sau:

Output
+-----------------------------+
 | Database                  |
+-----------------------------+
 | information_schema |
 | travellist                   |
+-----------------------------+
2 rows in set (0.01 sec)

Tiếp theo, hãy tạo một bằng có tên là places trong cơ sở dữ liệu travellist. Từ MySQL console, chạy câu lệnh sau:

mysql> CREATE TABLE travellist.places (
mysql> id INT AUTO_INCREMENT,
mysql> name VARCHAR(255),
mysql> visited BOOLEAN,
mysql> PRIMARY KEY(id)
mysql> );

Sau đó, bạn thêm dữ liệu theo mẫu vào bảng places:

mysql> INSERT INTO travellist.places (name, visited) 
mysql> VALUES ("Tokyo", false),
mysql> ("Budapest", true),
mysql> ("Nairobi", false),
mysql> ("Berlin", true),
mysql> ("Lisbon", true),
mysql> ("Denver", false),
mysql> ("Moscow", false),
mysql> ("Olso", false),
mysql> ("Rio", true),
mysql> ("Cincinnati", false),
mysql> ("Helsinki", false);

Để xác nhận dữ liệu đã được lưu vào bảng thành công, hãy chạy lệnh sau:

mysql> SELECT * FROM travellist.places;

Bạn sẽ nhận được kết quả tương tự như sau:

Output
+---+---------------+----------+
 | id | name         | visited |
+---+---------------+----------+
 |  1 | Tokyo         |       0   |
 |  2 | Budapest   |       1   |
 |  3 | Nairobi       |       0   |
 |  4 | Berlin         |       1   |
 |  5 | Lisbon        |       1   |
 |  6 | Denver       |       0   |
 |  7 | Moscow      |       0   |
 |  8 | Oslo            |       0  |
 |  9 | Rio              |       1  |
 | 10 | Cincinnati  |       0  |
 | 11 | Helsinki     |       0   |
+----+---------------+---------+
11 rows in set (0.00 sec)

Khi xác nhận đã có dữ liệu hợp lệ trong test table, bạn thoát khỏi MySQL console bằng lệnh:

mysql> exit

Giờ đây bạn đã có thể bắt đầu tạo ứng dụng và cấu hình để kết nối cơ sở dữ liệu mới.

Bước 3: Tạo ứng dụng Laravel mới

Bạn cần tạo một ứng dụng Laravel mới bằng cách sử dụng lệnh composer create-project. Lệnh Composer này thường được dùng để khởi tạo các ứng dụng mới trên các framework và hệ thống quản lý nội dung.

Trong hướng dẫn này sẽ sử dụng travellist để làm ví dụ, bạn hoàn toàn có thể thay đổi theo ý muốn. Ứng dụng travellist sẽ hiển thị danh sách những vị trí được lấy từ một máy chủ MySQL cục bộ, nhằm thể hiện cấu hình cơ bản của Laravel và xác nhận kết nối đến cơ sở dữ liệu.

Trước tiên, hãy di chuyển đến thư mục home của user:

$ cd ~

Sau đó sử dụng câu lệnh sau để tạo ra một thư mục travellist mới chứa ứng dụng khuôn Laravel dựa trên các cài đặt mặc định:

$ composer create-project --prefer-dist laravel/laravel travellist

Bạn sẽ nhận được kết quả tương tự như sau:

Output
Installing laravel/laravel (v5.8.17)
  - Installing laravel/laravel (v5.8.17): Downloading (100%)         
Created project in travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%)         
  - Installing phpoption/phpoption (1.5.0): Downloading (100%)         
  - Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)         
  - Installing symfony/css-selector (v4.3.2): Downloading (100%)     
...

Sau khi hoàn tất quá trình cài đặt, bạn truy cập vào ứng dụng và chạy lệnh artisan của Laravel để xác nhận tất cả các thành phần đã được cài đặt thành công:

$ cd travellist
$ php artisan

Kết quả trả về tương tự như sau:

Output
Laravel Framework 7.11.0
Usage:
  command [options] [arguments]
Options:
  -h, --help                   Display this help message
  -q, --quiet                  Do not output any message
  -V, --version               Display this application version
       --ansi                    Force ANSI output
       --no-ansi               Disable ANSI output
  -n, --no-interaction    Do not ask any interactive question
       --env[=ENV]         The environment the command should run under
  -v|vv|vvv, --verbose   Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...

Kết quả này xác nhận rằng các tệp ứng dụng đã được cài đặt đúng vị trí và các dòng lệnh Laravel hoạt động đúng ý định. Tuy nhiên bạn vẫn cần cấu hình ứng dụng để thiết lập cơ sở dữ liệu và một vài chi tiết khác.

Để cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04, bạn cần có một máy chủ Ubuntu 20.04. Nếu chưa có máy chủ hoặc muốn nâng cấp máy chủ, bạn có thể liên hệ với Vietnix để được tư vấn và lựa chọn một máy chủ VPS phù hợp với nhu cầu.

Vietnix hiện đang cung cấp nhiều gói VPS có cấu hình đa dạng như VPS Giá Rẻ, Cloud Server, VPS Cao Cấp và VPS NVMe với nhiều ưu điểm như:

  • Giá thành hợp lý, chỉ từ 89.000 VND/Tháng. Đăng ký chu kỳ càng dài thì giảm càng nhiều.
  • Tốc độ cao, ổn định.
  • Hỗ trợ backup tự động hàng tuần.
  • Hỗ trợ nhiều hệ điều hành bao gồm cả Ubuntu 20.04.
  • Kích hoạt nhanh chóng, quản trị đơn giản.
  • Đặc biệt, tặng bản quyền theme và plugin WordPress trị giá đến 26.000.000 VND.

Liên hệ với đội ngũ của Vietnix để được tư vấn chi tiết hơn.

Bước 4: Cấu hình Laravel

Các file cấu hình Laravel được lưu trữ trong thư mục config, bên trong thư mục gốc của ứng dụng. Ngoài ra khi bạn cài đặt Laravel bằng Composer sẽ tạo đồng thời một environment file chứa các cài đặt cụ thể cho môi trường ứng dụng đang chạy và ưu tiên hơn các giá trị được đặt trong tập cấu hình được lưu trong thư mục config.

Mỗi lần cài đặt trên một môi trường mới đòi hỏi environment file được điều chỉnh để xác định các thông số như cài đặt kết nối database, tùy chọn gỡ lỗi, URL của ứng dụng và một số mục khác.

Lưu ý đặc biệt, tệp cấu hình môi trường (environment configuration file) chứa các thông tin nhạy cảm của máy chủ, cao gồm thông tin đăng nhập cơ sở dữ liệu và các khóa bí mật. Do đó, bạn không nên chia sẻ tệp này công khai.

Bạn cần chỉnh sửa tệp .env để tùy chỉnh các tùy chọn cấu hình cho môi trường ứng dụng hiện tại. Mở tệp .env bằng trình chỉnh sửa văn bản, ví dụ dưới đây sử dụng nano:

$ nano .env

Mặc dù có nhiều biến cấu hình trong tệp này, bạn không nhất thiết phải thiết lập chúng ngay. Thông tin cơ bản về các biến như sau:

  • APP_NAME: Tên ứng dụng, được sử dụng cho các thông báo và tin nhắn.
  • APP_ENV: Môi trường ứng dụng hiện tại.
  • APP_KEY: Được sử dụng để tạo ra salts và hash, khóa duy nhất này được tạo tự động khi cài đặt. Laravel thông qua Composer, vì vậy bạn không cần phải thay đổi nó.
  • APP_DEBUG: Cho phép có/không hiển thị thông tin gỡ lỗi trên phía máy khách.
  • APP_URL: Địa chỉ URL cho ứng dụng, được sử dụng để tạo các liên kết.
  • DB_DATABASE: Tên cơ sở dữ liệu.
  • DB_USERNAME: Tên người dùng kết nối với cơ sở dữ liệu.
  • DB_PASSWORD: Mật khẩu kết nối với cơ sở dữ liệu.

Mặc định các giá trị này được cấu hình cho local development environment sử dụng Homestead, một Vagrant box được có sẵn do Laravel cung cấp. Bạn thực hiện thay đổi các giá trị này để thiết lập môi trường ứng dụng.

Ở ví dụ này, bạn đang cài đặt Laravel trong development environment hoặc testing environment cho nên có thể bật tùy chọn APP_DEBUG. Việc này cung cấp thông tin gỡ lỗi quan trọng khi kiểm thử ứng dụng từ trình duyệt. Biến môi trường APP_ENV cần được thay đổi thành development hoặc testing.

Đối với trường hợp cài đặt Laravel trong production environment, bạn nên tắt tùy chọn APP_DEBUG vì nó hiển thị cho người dùng cuối những thông tin nhạy cảm của ứng dụng. Biến môi trường APP_ENV trong trường hợp này được thiết lập thành production.

File .env dưới đây cấu hình cho ứng dụng trong development environment:

Lưu ý, biến APP_KEY chứa khóa duy nhất đã được tạo tự động khi cài đặt Laravel qua Composer, bạn không cần phải thay đổi giá trị này. Nếu muốn tạo một khóa an toàn mới, hãy sử dụng lệnh php artisan key:generate.

APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
…

Chỉnh sửa các biến tương ứng. Sau khi hoàn thành, nhấn lưu và đóng file để cập nhật các thay đổi. Nếu sử dụng nano, bạn có thể nhấn tổ hợp phím CTRL+X sau đó nhấn Y rồi ENTER để xác nhận.

Như vậy, ứng dụng Laravel đã được thiết lập. Tuy nhiên bạn cần phải cấu hình web server để truy cập ứng dụng từ trình duyệt. Trong bước tiếp theo sẽ hướng dẫn bạn cách cấu hình Nginx để phục vụ ứng dụng Laravel.

Bước 5: Cài đặt Nginx

Ở bước trên, bạn đã cài đặt Laravel trên local folder của thư mục người dùng từ xa. Mặc dù điều này tốt cho môi trường phát triển cục bộ nhưng lại không được khuyến khích cho các web server sử dụng trên internet công khai. Bạn cần di chuyển thư mục ứng dụng đến /var/www thường dùng cho các ứng dụng web chạy trên Nginx.

Đầu tiên, hãy sử dụng lệnh mw để di chuyển thư mục ứng dụng cùng tất cả nội dung đến /var/www/travellist:

$ sudo mv ~/travellist /var/www/travellist

Bạn cần phải cấp quyền ghi cho người dùng web server đối với thư mục storagecache, nơi Laravel lưu trữ các tệp được tạo bởi ứng dụng:

$ sudo chown -R www-data.www-data /var/www/travellist/storage
$ sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache

Mặc dù các tệp ứng dụng đã được cấu hình nhưng bạn vẫn cần phải cấu hình Nginx để đáp ứng nội dung. Để làm điều này, hãy tạo một tệp cấu hình virtual host mới tại /etc/nginx/sites-available:

$ sudo nano /etc/nginx/sites-available/travellist

Tệp cấu hình sau chứa các cài đặt được khuyến nghị cho các ứng dụng Laravel trên Nginx: 

server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travellist/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        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$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Sao chép nội dung trên vào file /etc/nginx/sites-available/travellist, thay đổi các giá trị server_domain_or_IP, travellist để phù hợp với cấu hình của bạn. Sau đó nhấn lưu và đóng file.

Để kích hoạt file cấu hình virtual host mới tạo, hãy tạo một symbolic link đến travellist trong sites-enable:

$ sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Lưu ý, nếu bạn có một virtual host file khác đã được cấu hình trước đó với cùng server_name được sử dụng cho travellist virtual host, bạn có thể vô hiệu hóa cấu hình cũ bằng cách xóa symbolic link tương ứng trong /etc/nginx/sites-enabled/.

Để chắc chắn cấu hình không bị lỗi cú pháp nào, chạy câu lệnh sau:

$ sudo nginx -t

Kết quả nhận được như sau:

$ 
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
$ nginx: configuration file /etc/nginx/nginx.conf test is successful

Để áp dụng các thay đổi, reload lại Nginx với lệnh:

$ sudo systemctl reload nginx

Bây giờ, hãy truy cập ứng dụng bằng trình duyệt và sử dụng tên miền hoặc địa chỉ IP máy chủ được xác định bởi server_name trong file cấu hình:

http://server_domain_or_IP

Bạn sẽ nhận được kết quả hiển thị trang như sau:

Giao diện hiển thị ứng dụng Laravel
Giao diện hiển thị ứng dụng Laravel

Điều này cho biết máy chủ Nginx đã được cấu hình đúng để phục vụ Laravel. Giờ đây bạn có thể bắt đầu xây dựng ứng dụng trên nền tảng được cung cấp bởi cài đặt mặc định.

Trong bước tiếp theo, bạn sẽ được hướng dẫn sửa đổi main route của ứng dụng để truy vấn dữ liệu trong database bằng DB facade của Laravel.

Bước 6: Tùy chỉnh trang chính

Các bước trên đã hướng dẫn bạn cách cài đặt ứng dụng Laravel và một bảng database có tên places chứa một số mẫu dữ liệu. Bây giờ bạn cần chỉnh sửa tệp định tuyến ứng dụng để truy vấn cơ sở dữ liệu và trả về nội dung cho chế độ xem ứng dụng.

Hãy mở file định tuyến routes/web.php:

$ nano routes/web.php

Tệp mặc định này đi kèm với nội dung sau:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Các route được xác định trong tệp bằng cách sử dụng static method Route::get nhận một path và một callback function làm đối số.

Đoạn code dưới đây thay thế main route callback function, thực hiện 2 truy vấn đến database bằng cách sử dụng flag visited để lọc kết quả. Kết quả trả về là chế độ xem có tên là travellist. Sao chép nội dung sau vào file routes/web.php, thay thế đoạn code đã có:

<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $visited = DB::select('select * from places where visited = ?', [1]);
  $togo = DB::select('select * from places where visited = ?', [0]);
  return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});

Lưu và đóng file sau khi cập nhật xong. Tiếp theo bạn cần tạo view để hiển thị kết quả database cho người dùng. Tạo một file mới trong thư mục resources/views:

$ nano resources/views/travellist.blade.php

Mẫu dưới đây tạo ra hai danh sách place dựa trên các biến visited togo. Sao chép nội dung này vào file view:

<html>
<head>
       <title>Travel List</title>
</head>

<body>
      <h1>My Travel Bucket List</h1>
      <h2>Places I'd Like to Visit</h2>
      <ul>
         @foreach ($togo as $newplace)
               <li>{{ $newplace->name }}</li>
         @endforeach
      </ul>

      <h2>Places I've Already Been To</h2>
      <ul>
        @foreach ($visited as $place)
                <li>{{ $place->name }}</li>
        @endforeach
        </ul>
</body>
</html>

Lưu và đóng file sau khi hoàn thành. Hãy mở trình duyệt web ra và tải lại ứng dụng, bạn sẽ nhận được một trang tương tự như sau:

Giao diện hiển thị hai list place trên ứng dụng
Giao diện hiển thị hai list place trên ứng dụng

Như vậy, bạn đã thiết lập xong một ứng dụng Laravel hoạt động trên cơ sở dữ liệu MySQL.

Nếu bạn đang cần thuê VPS để triển khai các dự án, hãy liên hệ với Vietnix để được hỗ trợ tư vấn lựa chọn gói dịch vụ phù hợp với nhu cầu.

Vietnix là nhà cung cấp VPS tốc độ cao uy tín hàng đầu tại Việt Nam với nhiều điểm mạnh để bạn hoàn toàn yên tâm về chất lượng dịch vụ tại đây:

  • Vietnix có kinh nghiệm 10 năm trong lĩnh vực cung cấp dịch vụ VPS và đã được hơn 50.000 khách hàng trong và ngoài nước lựa chọn.
  • Hơn 100.000 dịch vụ đã được kích hoạt.
  • Vietnix cũng đã nhận giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022.
  • Ngoài ra, 97% khách hàng sử dụng VPS tại Vietnix đều có đánh giá 5 sao và giới thiệu cho người quen.

Liên hệ cho Vietnix theo những thông tin dưới đây để được tư vấn giải đáp VPS tốc độ cao, ổn định hàng đầu trên thị trường.

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn

Lời kết

Trong bài viết về cách cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04 trên, Vietnix đã hướng dẫn bạn cách thiết lập ứng dụng Laravel trên nền tảng LEMP (Linux, Nginx, MySQL, PHP) chạy trên Ubuntu 20.04. Đồng thời thiết lập route mặc định để truy vấn nội dung cơ sở dữ liệu và hiển thị kết quả trong một view tùy chỉnh. Từ đây bạn có thể tạo các route mới cho các trang bổ sung khi cần thiết. Nếu có bất kỳ ý kiến đóng góp nào liên quan, hãy để lại bình luận ngay dưới nhé.

Chia sẻ lên

Theo dõi trên

Logo Google new

Đánh giá

5/5 - (55 bình chọn)

Hưng Nguyễn

Kết nối với mình qua

Icon Quote
Icon Quote
Đăng ký nhận tin
Để không bỏ sót bất kỳ tin tức hoặc chương trình khuyến mãi từ Vietnix

Bình luận

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận