Cách triển khai ứng dụng Laravel với Nginx trên Ubuntu 16.04
Laravel là một trong những khung ứng dụng web open-souce phổ biến nhất được viết bằng PHP. Nó nhằm mục đích giúp các nhà phát triển xây dựng cả ứng dụng đơn giản và phức tạp bằng cách làm cho các việc ứng dụng thường xuyên sử dụng (như bộ nhớ đệm và xác thực) dễ dàng hơn.
Trong hướng dẫn này, ta sẽ triển khai một ứng dụng Laravel đơn giản có lưu ý đến môi trường production , yêu cầu một vài bước phổ biến. Ví dụ, các ứng dụng nên sử dụng một user database chuyên dụng với quyền truy cập chỉ giới hạn ở các database cần thiết. Quyền đối với file phải đảm bảo chỉ những folder và file cần thiết mới có thể ghi được. Cài đặt ứng dụng cần được xem xét đảm bảo không có thông tin gỡ lỗi nào được hiển thị cho user cuối, điều này có thể làm lộ chi tiết cấu hình ứng dụng.
Hướng dẫn này là về việc triển khai một ứng dụng hiện có. Thay vào đó, nếu bạn muốn tìm hiểu về cách sử dụng chính framework Laravel, thì Laravel riêng của Laravel từ loạt bài Scratch là một nơi tốt để tham khảo .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
- Một server Ubuntu 16.04 được cài đặt với hướng dẫn cài đặt server ban đầu này , bao gồm một user không phải root có quyền sudo và một firewall .
- LEMP được cài đặt theo hướng dẫn Linux, Nginx, MySQL, PHP ( LEMP ) trên Ubuntu 16.04 .
- Tên domain đã trỏ đến server của bạn, như được mô tả trong Cách cài đặt tên server với DigitalOcean . Hướng dẫn này sẽ sử dụng
example.com
xuyên suốt. Điều này là cần thiết để có được certificate SSL cho trang web , vì vậy bạn có thể cung cấp ứng dụng của bạn một cách an toàn với mã hóa TLS.
Bước 1 - Cài đặt gói phụ thuộc
Để chạy các ứng dụng Laravel, bạn cần một số tiện ích mở rộng PHP và trình quản lý phụ thuộc PHP được gọi là Composer ngoài LEMP cơ bản.
Bắt đầu bằng cách cập nhật bộ nhớ cache của trình quản lý gói.
- sudo apt-get update
Các phần mở rộng PHP bạn cần để hỗ trợ chuỗi nhiều byte và hỗ trợ XML. Bạn có thể cài đặt các tiện ích mở rộng này, Composer và unzip
(cho phép Composer xử lý các file zip) cùng một lúc.
- sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
Bây giờ các gói phụ thuộc đã được cài đặt, ta sẽ tạo và cấu hình database MySQL và account user chuyên dụng cho ứng dụng.
Bước 2 - Cấu hình MySQL
Laravel hỗ trợ nhiều loại server database . Vì hướng dẫn này sử dụng ngăn xếp LE M P, MySQL sẽ lưu trữ dữ liệu cho ứng dụng.
Trong cài đặt mặc định, MySQL chỉ tạo account quản trị gốc . Việc sử dụng user database gốc trong một trang web là một phương pháp bảo mật không tốt vì nó có quyền không giới hạn trên server database . Thay vào đó, hãy tạo một user database chuyên dụng cho ứng dụng Laravel để sử dụng, cũng như một database mới mà user Laravel sẽ được phép truy cập.
Đăng nhập vào account quản trị root
MySQL.
- mysql -u root -p
Bạn sẽ được yêu cầu nhập password bạn đã đặt cho account gốc MySQL trong khi cài đặt.
Bắt đầu bằng cách tạo một database mới có tên laravel
, Đây là kết quả ta sẽ sử dụng cho trang web. Bạn có thể chọn một tên khác, nhưng hãy nhớ ghi nhớ vì bạn cần nó sau này.
- CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Tiếp theo, tạo một user mới sẽ được phép truy cập vào database này. Ở đây ta sử dụng laraveluser
làm tên user , nhưng bạn cũng có thể tùy chỉnh điều này. Hãy nhớ thay thế password
ở dòng sau bằng một password mạnh và an toàn.
- GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';
Xóa các quyền để thông báo cho server MySQL về những thay đổi.
- FLUSH PRIVILEGES;
Và thoát khỏi MySQL.
- EXIT;
Đến đây bạn đã cấu hình một database chuyên dụng và account user cho Laravel để sử dụng. Các thành phần database đã sẵn sàng, vì vậy tiếp theo, ta sẽ cài đặt ứng dụng demo.
Bước 3 - Cài đặt ứng dụng Demo
Ứng dụng khởi động quickstart
demo, được phân phối bởi Laravel trên GitHub , là một danh sách tác vụ đơn giản. Nó cho phép bạn thêm và xóa các mục công việc và lưu trữ các nhiệm vụ của nó trong database MySQL.
Đầu tiên, hãy tạo một folder trong folder root của web Nginx sẽ chứa ứng dụng. Vì ứng dụng demo được đặt tên là quickstart
, hãy sử dụng /var/www/html/quickstart
.
- sudo mkdir -p /var/www/html/quickstart
Tiếp theo, thay đổi quyền sở hữu của folder mới được tạo thành user của bạn, để bạn có thể làm việc với các file bên trong mà không cần sử dụng sudo
.
- sudo chown sammy:sammy /var/www/html/quickstart
Di chuyển đến folder mới và sao chép ứng dụng demo bằng Git.
- cd /var/www/html/quickstart
- git clone https://github.com/laravel/quickstart-basic .
Git sẽ download tất cả các file từ kho ứng dụng demo. Bạn sẽ thấy kết quả giống như sau:
Git outputCloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.
Tiếp theo, ta cần cài đặt các phụ thuộc của dự án. Laravel sử dụng Composer để xử lý quản lý phụ thuộc, giúp dễ dàng cài đặt các gói cần thiết chỉ trong một lần.
- composer install
Đầu ra hơi dài dòng sẽ hiển thị tiến trình cài đặt cho tất cả các phần phụ thuộc của dự án:
Composer outputLoading composer repositories with package information
Installing dependencies (including require-dev) from lock file
. . .
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader
Bản thân ứng dụng đã được cài đặt , vì vậy bước tiếp theo là cấu hình môi trường ứng dụng. Điều này liên quan đến việc kết nối ứng dụng và database và tùy chỉnh một số cài đặt cho quá trình production .
Bước 4 - Cấu hình môi trường ứng dụng
Trong bước này, ta sẽ sửa đổi một số cài đặt ứng dụng liên quan đến bảo mật, cho phép ứng dụng kết nối với database và chuẩn bị database để sử dụng. Đây là các bước cần thiết cho tất cả các ứng dụng Laravel được hỗ trợ bởi LEMP, không chỉ ứng dụng demo mà ta đang sử dụng ở đây.
Mở file cấu hình môi trường Laravel bằng nano
hoặc editor yêu thích của bạn.
- sudo nano /var/www/html/quickstart/.env
Bạn cần áp dụng các thay đổi sau đối với file . Đảm bảo cập nhật các biến giữ chỗ, như password
và example.com
, với các giá trị thích hợp.
APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com
DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password
. . .
Lưu file và thoát.
Hãy xem xét những thay đổi này chi tiết hơn. Có hai đoạn cấu hình ở đây; đầu tiên dành cho cấu hình ứng dụng và thứ hai dành cho cấu hình database .
Trong phần cấu hình ứng dụng:
Biến
APP_ENV
biểu thị môi trường hệ thống mà ứng dụng được chạy. Giá trị mặc định làlocal
được sử dụng cho môi trường phát triển local . Để triển khai production , nó nên được chuyển thànhproduction
, như ta đã làm ở đây.
Việc thay đổi biến này sẽ kiểm soát độ chi tiết của log , cài đặt bộ nhớ đệm và cách hiển thị lỗi (tùy thuộc vào ứng dụng). Với cài đặtlocal
, nó được cài đặt để dễ dàng phát triển và gỡ lỗi, điều này thuận tiện khi làm việc trên ứng dụng nhưng không nên sử dụng trong cài đặt production .Biến
APP_DEBUG
bổ sung choAPP_ENV
và bật hoặc tắt rõ ràng thông tin gỡ lỗi và hiển thị lỗi dài dòng. Trên cài đặt production , giá trị này phải được đặt thànhfalse
để ngăn thông tin gỡ lỗi hiển thị cho user .Biến
APP_URL
chỉ định địa chỉ IP hoặc domain mà trang web sẽ có thể truy cập được. Ta đã sử dụng domainexample.com
ở đây, nhưng bạn nên thay thế nó bằng domain của riêng mình mà trang web sẽ được truy cập.
Phần cấu hình database đơn giản hơn một chút:
-
DB_DATABASE
là tên của database . -
DB_USERNAME
là tên của user MySQL mà ứng dụng sẽ sử dụng. -
DB_PASSWORD
là password database cho user đó.
Tiếp theo, ta phải chạy di chuyển database , điều này sẽ điền vào database mới được tạo các bảng cần thiết để ứng dụng demo chạy đúng cách.
- php artisan migrate
Nghệ nhân sẽ yêu cầu xác nhận nếu ta có ý định chạy nó ở chế độ production . Trả lời y
cho câu hỏi. Nó sẽ chạy các việc database cần thiết sau đó.
Artisan output**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? [y/N] (yes/no) [no]:
> y
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_10_27_141258_create_tasks_table
Bây giờ ta đã cài đặt và cấu hình đầy đủ Laravel. Tiếp theo, ta cần cấu hình Nginx để phục vụ ứng dụng.
Bước 5 - Cấu hình Nginx
Thư mục ứng dụng thuộc sở hữu của user hệ thống của ta , sammy , và có thể đọc được nhưng không thể ghi bởi web server . Điều này đúng với phần lớn các file ứng dụng, nhưng có một số folder cần được xử lý đặc biệt. Cụ thể, bất cứ nơi nào Laravel lưu trữ phương tiện đã tải lên và dữ liệu được lưu trong bộ nhớ cache, web server không chỉ có thể truy cập chúng mà còn có thể ghi file vào chúng.
Hãy thay đổi quyền sở hữu group của các folder storage
và bootstrap/cache
thành www-data .
- sudo chgrp -R www-data storage bootstrap/cache
Sau đó, cấp đệ quy tất cả các quyền, bao gồm cả ghi và thực thi, cho group .
- sudo chmod -R ug+rwx storage bootstrap/cache
Bây giờ ta có tất cả các file ứng dụng demo tại chỗ với các quyền thích hợp. Tiếp theo, ta cần thay đổi cấu hình Nginx để làm cho nó hoạt động chính xác với cài đặt Laravel. Đầu tiên, hãy tạo một tệp cấu hình khối server mới cho ứng dụng của ta bằng cách sao chép qua file mặc định.
- sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
Mở file cấu hình mới tạo.
- sudo nano /etc/nginx/sites-available/example.com
Có một số thay đổi cần thiết bạn sẽ phải thực hiện:
- Xóa chỉ định
default_server
khỏi chỉ thịlisten
, - Cập nhật root web bằng cách thay đổi chỉ thị
root
, - Cập nhật lệnh
server_name
để trỏ chính xác đến domain cho server , - Cập nhật xử lý URI yêu cầu bằng cách thay đổi chỉ thị
try_files
.
Tệp cấu hình Nginx đã sửa đổi sẽ trông giống như sau:
server {
listen 80;
listen [::]:80;
. . .
root /var/www/html/quickstart/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
. . .
}
Hãy giải thích những thay đổi này chi tiết hơn.
Chỉ thị listen
trong file cấu hình mặc định đã bật tùy chọn default_server
, chỉ định rằng khối server sẽ phân phát một yêu cầu nếu không có khối server nào khác phù hợp. Chỉ một trong các khối server được bật mới có thể bật tùy chọn này. Bởi vì ta đã để nguyên khối server mặc định, ta sẽ xóa ký hiệu default_server
khỏi file cấu hình thứ hai này.
Chỉ thị root
chỉ định nơi các file ứng dụng được lưu trữ. Ứng dụng Laravel được lưu trữ trong /var/www/html/ quickstart
, nhưng chỉ folder con /public
mới được tiếp xúc với internet; tất cả các file ứng dụng khác hoàn toàn không thể truy cập được qua trình duyệt. Để tuân theo các phương pháp hay nhất này, ta đặt root web thành /var/www/html/ quickstart /public
.
Chỉ thị server_name
chỉ định danh sách domain mà khối server sẽ phản hồi. Ta đã sử dụng example.com
và www. example.com
ở đây, nhưng bạn nên thay những domain đó bằng domain bạn muốn sử dụng cho trang web của bạn .
Ta cũng đã thay đổi việc xử lý URI yêu cầu. Cài đặt mặc định yêu cầu web server tìm file hiện có, sau đó là folder hiện có hoặc cuối cùng là lỗi 404 Không tìm thấy (sử dụng cài đặt tích hợp =404
). Để Laravel hoạt động bình thường, tất cả các yêu cầu phải được chuyển đến chính Laravel. Điều này nghĩa là ta xóa trình xử lý lỗi 404 mặc định của Nginx và đặt nó thành /index.php?$query_string
, chuyển truy vấn yêu cầu đến index.php
, một file ứng dụng Laravel chính.
Khi bạn đã áp dụng các thay đổi ở trên, bạn có thể lưu file . Ta phải kích hoạt file cấu hình mới bằng cách tạo một softlink từ file này đến folder sites-enabled
.
- sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Và cuối cùng reload Nginx để tính đến các thay đổi.
- sudo systemctl reload nginx
Bây giờ Nginx đã được cấu hình để phục vụ ứng dụng Laravel demo, tất cả các thành phần đã được cài đặt .
Đảm bảo rằng việc triển khai của bạn đang hoạt động tại thời điểm này thật dễ dàng. Chỉ cần truy cập http:// example.com
trong trình duyệt yêu thích của bạn. Bạn sẽ thấy một trang có ứng dụng tác vụ đơn giản và bạn có thể thử thêm hoặc xóa công việc. Tất cả các thay đổi mà bạn thực hiện sẽ được lưu vào database và được giữ lại cho các lần truy cập tiếp theo vào trang web, bạn có thể xác minh bằng cách đóng trình duyệt và mở lại trang web.
Trong bước tiếp theo và cuối cùng, ta sẽ cấu hình mã hóa TLS để cung cấp ứng dụng qua kết nối an toàn.
Bước 6 - Bảo mật ứng dụng của bạn bằng TLS
Để hoàn tất cài đặt production , bạn nên phân phối ứng dụng thông qua HTTPS an toàn bằng TLS. Điều này sẽ đảm bảo tất cả thông tin liên lạc giữa ứng dụng và khách truy cập sẽ được mã hóa, điều này đặc biệt quan trọng nếu ứng dụng yêu cầu thông tin nhạy cảm như đăng nhập hoặc password .
Let's Encrypt là một tổ chức phát hành certificate miễn phí giúp việc thêm TLS vào trang web trở nên đơn giản. Để bật HTTPS cho ứng dụng mới được triển khai, ta sẽ làm theo hướng dẫn Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 16.04 với một số sửa đổi nhỏ để phù hợp với cài đặt của ứng dụng Laravel cụ thể này.
Những thay đổi duy nhất sẽ là:
- Sử dụng vị trí của ứng dụng Laravel (
/var/www/html/ quickstart
) thay vì root web mặc định (/var/www/html
) khi certificate request SSL. - Sửa đổi file cấu hình
/etc/nginx/sites-available/ example.com
thay vì file khối server mặc định.
Cụ thể, lệnh để lấy certificate sẽ là:
- sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com
Và version cuối cùng của file cấu hình /etc/nginx/sites-available/example.com
sẽ trông như thế này
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /var/www/html/quickstart/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
Đảm bảo kiểm tra rằng không có lỗi cú pháp nào trong cấu hình.
- sudo nginx -t
Nếu tất cả các thay đổi đều thành công, bạn sẽ nhận được kết quả như sau:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nếu đúng như vậy, bạn có thể khởi động lại Nginx một cách an toàn để các thay đổi có hiệu lực.
- sudo systemctl restart nginx
Chứng chỉ Let's Encrypt TLS / SSL sẽ được cung cấp đầy đủ và ứng dụng sẽ khả dụng thông qua kết nối an toàn. Để xác minh xem mọi thứ có hoạt động như mong đợi hay không, chỉ cần truy cập https :// example.com
. Bạn sẽ thấy mẫu đơn đăng ký tương tự như trước, nhưng lần này kết nối sẽ được bảo mật hoàn toàn.
Kết luận
Đến đây bạn đã triển khai thành công một ứng dụng demo được chuyển cùng với Laravel đến môi trường production bằng cách sử dụng LEMP . Với các ứng dụng trong thế giới thực, danh sách các việc cấu hình có thể bao gồm nhiều bước hơn và các hành động dành riêng cho ứng dụng. Khi nghi ngờ, hãy luôn tham khảo tài liệu của ứng dụng bạn đang triển khai, nhưng bạn cũng có thể tìm thấy nhiều thông tin hữu ích trong tài liệu chính thức của Laravel .
Các tin liên quan
Cách bảo mật CI bằng SSL bằng Nginx trên Ubuntu 16.042017-05-26
Cách cấu hình Buildbot với SSL bằng Nginx Reverse Proxy
2017-05-17
Cách cấu hình Jenkins với SSL bằng cách sử dụng Nginx Reverse Proxy
2017-05-02
Cách tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 7
2017-01-09
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 8
2016-12-22
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 8
2016-12-20
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8
2016-12-19
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Nginx
2016-12-19
Cách thêm module gzip vào Nginx trên Ubuntu 16.04
2016-12-02