Một số thiết lập cần thiết trước khi deploy ứng dụng Laravel lên môi trường production

Ở đây chắc cũng không ít bạn trải qua cảm giác đổ mồ hôi hột vừa chân ướt chân ráo khi mà tới giai đoạn deploy ứng dụng Laravel của mình lên production. Mình cũng từng trải qua cảm giác như vậy, thấu hiểu được tâm tư tình cảm của mọi người đặc biệt là những bạn lần đầu tham gia vào quá trình deploy ứng dụng của mình lên production.

Laravel app deploying

Vậy nên, hôm nay mình sẽ hướng dẫn các bạn một số setup server cơ bản và cần thiết để quá trình deploy trở nên đơn giản, mượt mà hơn. Về phần nội dung của hướng dẫn sẽ bao gồm một số setup cơ bản sau đây: 

  • Setup Nginx
  • Setup PHP FPM
  • Setup PhpmyAdmin
  • Migrate database
  • Test deploy

Về yêu cầu thì cần mọi người phải hiểu cơ bản về một số lệnh cài đặt Linux, vai trò của Nginx và PHP FPM trong ứng dụng. Không để mọi người đợi lâu nữa thì mình sẽ giải thích các thành phần mình cần phải thiết lập trước khi đi vào trong ứng dụng.

Trước khi đi vào cấu hình thì mọi người chạy với quyền sudo nhé.

Setup NGINX

Trước hết thì mình sẽ giới thiệu sơ qua Nginx thì Nginx hiểu đơn giản là một máy chủ web và proxy giúp giải quyết các vấn đề cân bằng tải nhờ sử dụng kỹ thuật không đồng bộ (asynchronous) việc này giúp cho máy chủ Nginx đạt được hiệu suất và ổn định cao.

Thì lý thuyết mình tóm gọn lại như vậy để các bạn hình dung về công dụng và vai trò của Nginx còn rất nhiều công dụng của Nginx các bạn có thể tham khảo trên trang chủ https://www.nginx.com/.  Sau khi mà cài đặt xong nginx trên môi trường Linux của bạn thì mặc định thông tin cấu hình Nginx sẽ được đặt ở trong thư mục /etc/nginx/. Ở trong đây sẽ có rất nhiều file và thư mục khác nhau. File quan trọng nhất để ứng dụng Nginx bạn cần hoạt động là nginx.conf. Tập tin này sẽ chứa những thông tin cấu hình cần thiết để cấu hình ứng dụng web hoạt động.  Một file nginx.conf cơ bản chứa các phần sau: 

  • Cấu hình chung: user, worker_processes, pid, events block,…
  • Cấu hình HTTP blocks: keepalive, timeout, và buffers,…
  • Cấu hình máy chủ (Server block): location, ssl,…

Cấu hình file nginx.conf các bạn có thể tham khảo dưới đây: 

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    real_ip_header X-Forwarded-For;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 3000;
    server_names_hash_bucket_size 128;
    client_max_body_size 2048M;
    server_tokens off;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
}

Một số thông tin trong Nginx quan trọng mọi người cần lưu ý khi cấu hình:

  • Thứ nhất là worker_processes: xác định số lượng các worker process (tiến trình làm việc) mà Nginx sẽ sử dụng để xử lý các kết nối đồng thời. Cách tính worker_processes sẽ dựa trên số lượng CPU ở trên máy chủ web. Số lượng worker processes thường là bội số của 2, điều này liên quan đến cách Nginx sử dụng kiến trúc không đồng bộ để xử lý nhiều kết nối đồng thời mà không tăng đáng kể số lượng tiến trình.
  • Thứ hai là block http: thường chỉ đến một phần của cấu hình được sử dụng để định nghĩa cách xử lý request HTTP. Một “block http” có thể chứa nhiều thông số và chỉ thị để tùy chỉnh cách Nginx xử lý các yêu cầu web.

Thông thường sau khi cài đặt Nginx để làm Webserver mặc định khi upload file lên có dung lượng hơn 10MB thì NGINX sẽ ngay lập tức báo lỗi “413 Request Entity Too Large” thì để khắc phục được điều này thì mọi người phải tăng kích cỡ của client_max_body_size lên. Trong ví dụ trên thì cấu hình đang để là 2048M tức là 2GB.

Ngoài ra mọi người cần lưu ý cần thêm một số thông tin header sau liên quan đến thiết lập security cho ứng dụng của mình: 

  • add_header X-Frame-Options SAMEORIGIN”, header này giúp bảo vệ trang web khỏi một số tấn công như clickjacking, trong đó một trang web độc hại cố gắng “lừa đảo” người dùng bằng cách ẩn các phần của trang web khác trong một frame.
  • add_header X-Content-Type-Options “nosniff”; header này được sử dụng để bảo vệ trình duyệt khỏi việc tự đoán kiểu nội dung của tài nguyên (ví dụ: file JavaScript hoặc CSS) dựa trên nội dung thực tế của file. Chức năng chính của nó là ngăn chặn tấn công kiểu MIME (MIME type sniffing) bằng cách yêu cầu trình duyệt hiển thị nội dung của file theo kiểu MIME được chỉ định trong header “Content-Type”.

Tiếp theo là mọi người cần phải thiết lập block server để Nginx có thể xác định được đường đi cho từng request gọi đến thì dưới đây là thông tin cấu hình cơ bản mọi người có thể tham khảo:

server {
    listen 80;
    server_name example.com;
    root  /var/www/html/laravel-server/public;

    index index.php index.html index.htm;

    access_log /var/log/nginx/laravel-server-access.log;
    error_log  /var/log/nginx/laravel-server-error.log error;

    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$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param  HTTPS 'on';
        include fastcgi_params;
    }
}

File này được đặt ở trong thư mục conf.d cùng cấp với thư mục của nginx.conf. Giải thích sơ qua về cấu hình ở phía trên, phần quan trọng nhất là khai báo root để trỏ đến thư mục public của ứng dụng laravel và thiết lập location. Mặc định khi người dùng truy cập đến ứng dụng Laravel của mình thì sẽ thông qua Nginx, thiết lập location đối với cấu hình phía trên thì Nginx sẽ thử uri mà người dùng truy cập, khi có một request từ phía người dùng thì sẽ không ngay lập tức vào ngay trong ứng dụng của mình mà sẽ đi thông qua Nginx và Nginx sẽ quyết định server PHP sẽ thực hiện xử lý request đó bằng cách load file index.php và truyền các parameter người dùng truyền vào hoặc api gọi từ phía frontend. Còn nếu mà uri này không hợp lệ thì Nginx sẽ tự động redirect sang trang 404. Sau khi mà xác định được con đường đi đúng đắn của mình thì Nginx sẽ tiến hành chuyển các request này cho server PHP xử lý tiếp.  

Về phần này thì mọi người cần lưu ý một số điểm quan trọng dưới đây:

  • Thứ nhất là root: dùng để trỏ đến thư mục public website Laravel của mình. Ở đây mọi người phải trỏ đúng với thư mục public trong source web của mình chứ không phải thư mục ngoài cùng mà mọi người thường hay dùng để chạy các lệnh php artisan.
  • Thứ hai là location: mục đích của location là để khi mà có request từ người dùng thì Nginx sẽ xử lý các request tới các địa chỉ URL cụ thể.

Dưới đây là một số ví dụ về cách location có thể được sử dụng:

Location dựa trên tiền tố của URL:

location / {
    # 
}

Location dựa trên đuôi của URL:

location ~ \.php$ {
    # 
}

Location với biểu thức chính quy:

location ~* \.(jpg|jpeg|png)$ {
    # 
}

Một số config cơ bản của NGINX là vậy thì phần tiếp theo là sau khi một request đi qua NGINX thì Nginx sẽ tiến hành điều phối request đế đến từng con server PHP tới giai đoạn này rồi thì server không thể thực hiện ngay mà cần phải thông qua một trình biên dịch để chạy trang web. Một trong những trình biên dịch phổ biến nhất hiện nay được kể đến là PHP FPM. 

Setup PHP-FPM

PHP-FPM viết tắt của “FastCGI Process Manager,” là một trình quản lý quy trình FastCGI được thiết kế để điều phối các request đến từng worker process của PHP. PHP-FPM thường được sử dụng để cải thiện hiệu suất và mở rộng khả năng đáp ứng của máy chủ web chạy PHP.

Đầu tiên, ta cần mở tệp cấu hình PHP FPM. Thông thường, nó được đặt tại “/etc/php-fpm.d/www.conf”. Trong tệp này, mọi người có thể thiết lập các thông số quan trọng như user, group, và listen để PHP FPM hoạt động chính xác với môi trường của mọi người đang sử dụng.

user = root

group = root

listen = 127.0.0.1:9000

Ở đây, “root” là user và group được sử dụng bởi PHP FPM, và mọi người lưu ý cần phải khai báo “listen” đúng với thông tin fastcgi_pass thiết lập ở phần Nginx ở phía trên.

Tiếp theo là một điểm cần lưu ý mọi người cần phải thay đổi là thông tin pm.max_children thông tin này sẽ xác định số lượng tối đa các worker processes (tiến trình làm việc) PHP mà PHP-FPM có thể tạo ra. Mỗi worker process sẽ xử lý một yêu cầu PHP đồng thời. Giới hạn này quan trọng để tránh quá tải tài nguyên hệ thống.

Khi lựa chọn giá trị cho pm.max_children, mọi người cần xem xét các yếu tố như dung lượng bộ nhớ của máy chủ, yêu cầu tài nguyên của ứng dụng PHP, và cấu hình của server. Dưới đây là một số điều cần lưu ý:

  • Dung lượng Bộ Nhớ: Mỗi worker process sẽ sử dụng một lượng bộ nhớ nhất định. Việc quá tải worker processes có thể dẫn đến sự tiêu thụ quá mức của bộ nhớ, dẫn đến hiện tượng swap và giảm hiệu suất.
  • Yêu Cầu Tài Nguyên của Ứng Dụng: Nếu ứng dụng PHP của bạn yêu cầu nhiều tài nguyên (ví dụ: tạo và xử lý các kết nối đến cơ sở dữ liệu), mọi người có thể cần giảm giá trị của pm.max_children để tránh quá tải tài nguyên hệ thống.
  • Cấu Hình Server: Đôi khi, số lượng worker processes cần phải được điều chỉnh dựa trên cấu hình và yêu cầu của server. Việc thử nghiệm và theo dõi hiệu suất là bước quan trọng để tìm ra giá trị tối ưu.

Một ví dụ cấu hình PHP-FPM với pm.max_children có thể như sau:

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

Khi thay đổi thông tin max_children thì mọi người cần lưu ý là phải điều chỉnh pm sang dạng dynamic thì PHP FPM mới tạo được ra các worker process con và còn một điều không quên nữa là sau khi thay đổi cấu hình thì mọi người phải restart lại để server có thể nhận được thông tin của cấu hình mới nhất.

Lưu ý là khi thiết lập NGINX thì mọi người cần phải thêm config fastcgi_pass, fastcgi_param,… dưới đây trong block server vừa cấu hình ở phía trên của mình.

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

Ở đoạn code trên, “fastcgi_pass” là nơi sẽ chỉ định socket của PHP FPM mà Nginx sẽ sử dụng để chuyển request đến. “fastcgi_param” sẽ truyền các params được truyền vào hoặc api gọi có dạng key – value ví dụ ?id=1

Setup PhpMyAdmin

Tiếp theo, để quản lý cơ sở dữ liệu của bạn dễ dàng hơn, mọi người có thể cài đặt và cấu hình PhpMyAdmin để quản lý CSDL của mình. Điều này giúp mọi người kiểm soát cơ sở dữ liệu của mình một cách hiệu quả.

sudo apt install phpmyadmin

Trong quá trình cài đặt thì sẽ yêu cầu mình nhập một số thông tin như thông tin tên đăng nhập, mật khẩu và một số thông tin cần thiết khác.

Sau khi cài đặt xong, mọi người cũng tiến hành vào trong thư mục /etc/nginx/conf.d tạo ra file phpmyadmin.conf chứa cấu hình như ví dụ phía dưới:

server {
    listen       8080 default_server;
    listen       [::]:8080 default_server;
    server_name  _;
    # Load configuration files.

    location /phpMyAdmin {
       root /usr/share/;
       index index.php index.html index.htm;

       location ~ ^/phpMyAdmin/(.+\.php)$ {
           try_files $uri =404;
           root /usr/share/;
           fastcgi_pass 127.0.0.1:9000;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           include /etc/nginx/fastcgi_params;
        }

        location ~* ^/phpMyAdmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
           root /usr/share/;
        }
    }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
}

Sau khi cài đặt xong, mọi người tiến hành restart lại nginx config bằng lệnh “nginx -s reload” lại có thể truy cập PhpMyAdmin bằng cách thêm “/phpmyadmin” vào địa chỉ web và đăng nhập với tài khoản MySQL đã cấu hình trong quá trình cài đặt.

Migrate database 

Khi tất cả các bước trên đã được thực hiện,  mọi người có thể chuyển sang quá trình cấu hình .env migration của Laravel để tạo các bảng cơ sở dữ liệu cần thiết cho ứng dụng của mình. 

php artisan migrate

Test deploy

Cuối cùng, để đảm bảo rằng việc deploy của bạn đã được thực hiện đúng cách, hãy thực hiện các bước kiểm thử deploy bằng cách truy cập trang web của bạn và đảm bảo rằng mọi thứ đều hoạt động như mong đợi.

Như vậy, với các bước setup cơ bản này, quá trình deploy ứng dụng Laravel của bạn lên production sẽ trở nên đơn giản và hiệu quả hơn. Chúc bạn thành công!

Tư vấn - Báo giá
Mở rộng quy mô doanh nghiệp của bạn với ONETECH!
Hãy liên hệ với chúng tôi để được cung cấp các dịch vụ phát triển phần mềm chất lượng cao với chi phí hợp lý nhất. Các kỹ sư của chúng tôi sẽ giúp bạn phát triển một giải pháp phù hợp để vượt lên đối thủ cạnh tranh của mình.
Mọi thông tin tư vấn và báo giá đều miễn phí.

    「Chính sách bảo mật」Nếu bạn đồng ý với những điều trên, vui lòng nhấp vào nút "Gửi"
    Một email trả lời tự động sẽ được gửi đến địa chỉ email bạn đã nhập, vì vậy hãy kiểm tra điều đó.
    Tư vấn - Báo giá
    Mở rộng quy mô doanh nghiệp của bạn với ONETECH!
    Hãy liên hệ với chúng tôi để được cung cấp các dịch vụ phát triển phần mềm chất lượng cao với chi phí hợp lý nhất. Các kỹ sư của chúng tôi sẽ giúp bạn phát triển một giải pháp phù hợp để vượt lên đối thủ cạnh tranh của mình.
    Mọi thông tin tư vấn và báo giá đều miễn phí.

      「Chính sách bảo mật」Nếu bạn đồng ý với những điều trên, vui lòng nhấp vào nút "Gửi"
      Một email trả lời tự động sẽ được gửi đến địa chỉ email bạn đã nhập, vì vậy hãy kiểm tra điều đó.
      liên hệ