Thứ ba, 24/11/2015 | 00:00 GMT+7

Cách triển khai ứng dụng Symfony sang sản xuất trên Ubuntu 14.04

Symfony là một web framework open-souce được viết bằng PHP, phù hợp để xây dựng các dự án ở mọi quy mô. Nó cung cấp một cấu trúc được thiết kế tốt, dựa trên các thành phần có thể tái sử dụng, trên đó bạn có thể xây dựng ứng dụng PHP của riêng mình.

Hướng dẫn này sẽ trình bày các bước cần thiết để triển khai thủ công ứng dụng Symfony cơ bản trên server Ubuntu 14.04. Ta sẽ xem cách cấu hình server đúng cách, cân nhắc các biện pháp bảo mật và hiệu suất để hoàn thành cài đặt sẵn sàng cho production .

Nếu bạn đang tìm kiếm một hướng dẫn giới thiệu về Symfony, bạn có thể đọc cách cài đặt và bắt đầu với Symfony trên Ubuntu 14.04 .

Yêu cầu

Đối với hướng dẫn này, bạn cần :

Điều quan trọng cần nhớ là triển khai là một chủ đề rất rộng vì mỗi ứng dụng sẽ có những nhu cầu cụ thể riêng. Để đơn giản hóa mọi việc, ta sẽ sử dụng một ứng dụng việc cần làm mẫu được xây dựng bằng Symfony. Bạn có thể tìm thấy mã nguồn của nó trên GitHub .

Bước 1 - Cài đặt Phụ thuộc Server

Trong bước này, ta sẽ cài đặt các phụ thuộc server .

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

Ta cần git để kiểm tra các file ứng dụng, acl để đặt quyền folder phù hợp khi cài đặt ứng dụng và hai phần mở rộng PHP ( php5-cli để chạy PHP trên dòng lệnh và php5-curl cho Symfony). Cài đặt các gói cần thiết.

  • sudo apt-get install git php5-cli php5-curl acl

Cuối cùng, ta cần trình composer để download các phụ thuộc của ứng dụng. Để cài đặt trình composer trên toàn hệ thống, hãy chạy:

  • sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Đến đây bạn đã sẵn sàng để đi.

Bước 2 - Cấu hình MySQL

Hãy bắt đầu bằng cách chuẩn bị cài đặt MySQL của bạn sẵn sàng để production . Đối với bước tiếp theo, bạn cần password cho account MySQL gốc . Đảm bảo rằng bạn đã cài đặt MySQL một cách an toàn (như chi tiết trong bước 2 của hướng dẫn LAMPLEMP ).

Nếu bạn đang sử dụng một trong các cú nhấp chuột của ta (LAMP / LEMP), bạn sẽ tìm thấy password root MySQL trong thông báo văn bản ngày được in khi bạn đăng nhập vào server của bạn . Nội dung của tin nhắn trong ngày cũng có thể được tìm thấy trong file /etc/motd.tail .

Đặt đối chiếu và bộ mã mặc định

Symfony khuyên bạn nên cài đặt bảng mã và đối chiếu database của bạn thành utf8 . Hầu hết các database sẽ sử dụng các đối chiếu kiểu Latinh theo mặc định, điều này sẽ gây ra kết quả không mong muốn khi truy xuất dữ liệu được lưu trữ trước đó trong database , như các ký tự lạ và văn bản không thể đọc được. Không có cách nào để cấu hình điều này ở cấp ứng dụng, vì vậy ta cần chỉnh sửa file cấu hình MySQL để bao gồm một vài định nghĩa.

Mở file /etc/mysql/my.cnf bằng editor dòng lệnh yêu thích của bạn.

  • sudo nano /etc/mysql/my.cnf

Bây giờ, hãy tìm khối [mysqld] . Thêm các tùy chọn character-set-server collation-server character-set-server trong Cài đặt cơ bản .

/etc/mysql/my.cnf
[mysqld] # # * Basic Settings # collation-server     = utf8mb4_general_ci # Replaces utf8_general_ci character-set-server = utf8mb4            # Replaces utf8 user            = mysql pid-file        = /var/run/mysqld/mysqld.pid socket          = /var/run/mysqld/mysqld.sock  . . . 

Lưu và thoát. Khởi động lại MySQL để các thay đổi có hiệu lực.

  • sudo service mysql restart

Tạo User và Database cho Ứng dụng

Bây giờ ta cần tạo một database MySQL và một user cho ứng dụng của ta .

Đầu tiên, truy cập client MySQL bằng account gốc MySQL.

  • mysql -u root -p

Bạn cần nhập password . Đây phải là password bạn đã sử dụng khi chạy mysql_secure_installation .

Bây giờ, hãy tạo database ứng dụng.

  • CREATE DATABASE todo;
Output
Query OK, 1 row affected (0.00 sec)

Database hiện đã được tạo. Bước tiếp theo là tạo một user MySQL và cung cấp cho họ quyền truy cập vào database mới được tạo của ta .

  • CREATE USER 'todo-user'@'localhost' IDENTIFIED BY 'todo-password';
Output
Query OK, 0 rows affected (0.00 sec)

Thao tác này sẽ tạo một user có tên là todo-user , với password là todo-password . Điều quan trọng cần lưu ý là đây là những giá trị ví dụ đơn giản nên được thay đổi và bạn nên sử dụng password phức tạp hơn cho user MySQL của bạn để cải thiện bảo mật.

Ta vẫn cần cấp cho user này quyền phù hợp đối với database ứng dụng của ta . Điều này có thể được thực hiện với:

  • GRANT ALL PRIVILEGES ON todo.* TO 'todo-user'@'localhost';
Output
Query OK, 0 rows affected (0.00 sec)

Điều này sẽ cấp cho người dùng todo- user tất cả các quyền trên tất cả các bảng bên trong database todo . Để áp dụng các thay đổi, hãy chạy:

  • FLUSH PRIVILEGES;
Output
Query OK, 0 rows affected (0.00 sec)

Để kiểm tra xem mọi thứ có hoạt động như mong đợi hay không, hãy thoát khỏi client MySQL.

  • quit;

Bây giờ đăng nhập lại, lần này bằng user và password MySQL mới mà bạn vừa tạo. Trong ví dụ này, ta đang sử dụng tên user todo-user , với password là todo-password .

  • mysql -u todo-user -p

Bạn có thể kiểm tra những database mà user này có quyền truy cập:

  • SHOW DATABASES;

Đầu ra sẽ như thế này:

Output
+--------------------+ | Database | +--------------------+ | information_schema | | todo | +--------------------+ 2 rows in set (0.00 sec)

Điều này nghĩa là user mới đã được tạo thành công với các quyền phù hợp. Bạn sẽ chỉ thấy hai database : information_schematodo .

Đến đây bạn có thể thoát khỏi client MySQL.

  • quit;

Bước 3 - Kiểm tra mã ứng dụng

Triển khai là một chủ đề rộng lớn do tính chất độc đáo của hầu hết các ứng dụng, ngay cả khi ta chỉ xem xét các dự án của Symfony. Thật khó để tổng quát hóa vì mỗi trường hợp sử dụng có thể yêu cầu các bước triển khai rất cụ thể, như di chuyển database hoặc chạy các lệnh cài đặt bổ sung.

Để đơn giản hóa quy trình hướng dẫn, ta sẽ sử dụng một ứng dụng demo cơ bản được xây dựng bằng Symfony. Bạn cũng có thể sử dụng ứng dụng Symfony của riêng mình, nhưng hãy nhớ rằng bạn có thể phải thực hiện các bước bổ sung tùy thuộc vào nhu cầu ứng dụng của bạn .

Ứng dụng của ta là một danh sách việc cần làm đơn giản cho phép bạn thêm và xóa các mục và thay đổi trạng thái của từng mục. Các mục việc cần làm được lưu trữ trong database MySQL. Mã nguồn có sẵn trên GitHub .

Ta sẽ sử dụng Git để kiểm tra mã ứng dụng. Bước tiếp theo là chọn một vị trí sẽ làm folder root ứng dụng của ta . Sau đó, ta sẽ cấu hình web server cho phù hợp. Đối với hướng dẫn này, ta sẽ sử dụng /var/www/todo-symfony , vì vậy hãy tạo folder đó ngay bây giờ.

  • sudo mkdir -p /var/www/todo-symfony

Trước khi nhân bản repository , hãy thay đổi chủ sở hữu folder và group để ta có thể làm việc với các file dự án bằng account regular user của ta . Thay thế sammy bằng tên user không phải root có quyền sudo của bạn.

  • sudo chown sammy:sammy /var/www/todo-symfony

Bây giờ, di chuyển đến folder mẹ và sao chép ứng dụng.

  • cd /var/www
  • git clone https://github.com/php-demos/todo-symfony.git todo-symfony
Output
Cloning into 'todo-symfony'... remote: Counting objects: 76, done. remote: Compressing objects: 100% (61/61), done. remote: Total 76 (delta 6), reused 76 (delta 6), pack-reused 0 Unpacking objects: 100% (76/76), done. Checking connectivity... done.

Bước 4 - Sửa quyền đối với folder

Các file ứng dụng hiện được đặt tại /var/www/todo-symfony , một folder thuộc sở hữu của user hệ thống của ta (trong hướng dẫn này, ta đang sử dụng sammy làm ví dụ). Tuy nhiên, user web server (thường là www-data ) cũng cần quyền truy cập vào các file đó. Nếu không, web server sẽ không thể phục vụ ứng dụng. Ngoài ra, có hai folder yêu cầu sắp xếp quyền đặc biệt: app/cacheapp/logs . Những folder này phải được ghi bởi cả user hệ thống và user web server .

Ta sẽ sử dụng ACL (Danh sách kiểm soát truy cập) để cấu hình các quyền đặc biệt này. ACL cho phép nhiều quyền truy cập chi tiết hơn cho các file và folder , đó là những gì ta cần để cài đặt các quyền chính xác trong khi tránh các sắp xếp quá dễ dãi.

Đầu tiên, ta cần cho phép user www-data truy cập vào các file bên trong folder ứng dụng. Cấp cho user này quyền đọc + thực thi (rX) trong toàn bộ folder .

  • sudo setfacl -R -m u:www-data:rX todo-symfony

Tiếp theo, ta cần cài đặt quyền đặc biệt cho các folder cachelogs . Cấp quyền đọc + ghi + thực thi (rwX) cho user www-data để cho phép web server chỉ ghi trong các folder này.

  • sudo setfacl -R -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs

Cuối cùng, ta sẽ xác định rằng tất cả các file mới được tạo bên trong folder app/cacheapp/logs tuân theo cùng một giản đồ quyền mà ta vừa xác định, với quyền đọc, ghi và thực thi đối với user web server . Điều này được thực hiện bằng cách lặp lại lệnh setfacl mà ta vừa chạy, nhưng lần này thêm tùy chọn -d .

  • sudo setfacl -dR -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs

Nếu bạn muốn kiểm tra quyền nào hiện đang có trong một folder nhất định, bạn có thể sử dụng getfacl .

  • getfacl todo-symfony/app/cache

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

Output
# file: todo-symfony/app/cache # owner: sammy # group: sammy user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:www-data:rwx default:group::rwx default:mask::rwx default:other::r-x

Từ kết quả kết quả này, bạn có thể thấy rằng mặc dù app/cache thuộc sở hữu của sammy user , nhưng vẫn có một bộ quyền bổ sung cho www-data user . Các chỉ thị mặc định cho biết các file mới được tạo bên trong folder này sẽ có quyền nào.

Bước 5 - Cài đặt ứng dụng

Bây giờ ta đã có các file ứng dụng, nhưng ta vẫn cần cài đặt các phụ thuộc của dự án và cấu hình các thông số ứng dụng.

Symfony được xây dựng để hoạt động tốt trên các môi trường khác nhau. Theo mặc định, nó sẽ sử dụng cài đặt phát triển, điều này ảnh hưởng đến cách nó xử lý bộ nhớ cache và lỗi. Môi trường phát triển có nhiều bản ghi chi tiết và phong phú hơn, nội dung được lưu trong bộ nhớ cache ít hơn và các lỗi được hiển thị một cách nổi bật để đơn giản hóa việc gỡ lỗi. Điều này hữu ích cho việc phát triển ứng dụng, nhưng nó không phải là một thực tiễn tốt cho môi trường production .

Để điều chỉnh ứng dụng cho production , ta cần xác định một biến môi trường cho Symfony biết rằng ta đang chạy ứng dụng trên môi trường production .

  • export SYMFONY_ENV=prod

Tiếp theo, ta cần cài đặt các phụ thuộc của dự án. Truy cập folder ứng dụng và chạy composer install .

  • cd todo-symfony
  • composer install --no-dev --optimize-autoloader

Khi kết thúc quá trình cài đặt, bạn sẽ được yêu cầu cung cấp một số thông tin sẽ điền vào file parameters.yml số.yml. Tệp này chứa thông tin quan trọng cho ứng dụng, như cài đặt kết nối database . Bạn có thể nhấn ENTER để chấp nhận các giá trị mặc định cho tất cả các giá trị này, ngoại trừ tên database , tên user và password . Đối với những giá trị đó, hãy sử dụng các giá trị bạn đã tạo ở bước 2 .

Output
Creating the "app/config/parameters.yml" file Some parameters are missing. Please provide them. database_host (127.0.0.1): database_port (null): database_name (symfony): todo database_user (root): todo-user database_password (null): todo-password . . .

Khi quá trình cài đặt kết thúc, ta có thể kiểm tra kết nối database bằng lệnh console doctrine:schema:validate .

  • php app/console doctrine:schema:validate
Output
[Mapping] OK - The mapping files are correct. [Database] FAIL - The database schema is not in sync with the current mapping file.

Dòng OK nghĩa là kết nối database đang hoạt động. Dòng FAIL được mong đợi vì ta chưa tạo schemas database , vì vậy hãy làm điều đó tiếp theo:

  • php app/console doctrine:schema:create
Output
ATTENTION: This operation should not be executed in a production environment. Creating database schema... Database schema created successfully!

Thao tác này sẽ tạo tất cả các bảng ứng dụng trong database đã cấu hình, theo thông tin metadata thu được từ các thực thể ứng dụng.

Khi di chuyển một ứng dụng hiện có, bạn nên tránh sử dụng doctrine:schema:createdoctrine:schema:update lệnh trực tiếp và thay vào đó thực hiện di chuyển database . Trong trường hợp của ta , việc di chuyển là không cần thiết vì ứng dụng phải được cài đặt với một database trống rỗng.

Đến đây bạn nên xóa bộ nhớ cache.

  • php app/console cache:clear --env=prod --no-debug
Output
Clearing the cache for the prod environment with debug false

Và cuối cùng, tạo nội dung ứng dụng.

  • php app/console assetic:dump --env=prod --no-debug
Output
Dumping all prod assets. Debug mode is off. 14:02:39 [file+] /var/www/todo-symfony/app/../web/css/app.css 14:02:39 [dir+] /var/www/todo-symfony/app/../web/js 14:02:39 [file+] /var/www/todo-symfony/app/../web/js/app.js

Bước 6 - Cài đặt Server Web

Điều duy nhất cần làm là cấu hình web server . Điều này sẽ bao gồm 2 bước: cài đặt chỉ thị date.timezone trong php.ini và cập nhật file cấu hình trang web mặc định (trên Apache hoặc Nginx) để phục vụ ứng dụng của ta .

Ta sẽ xem cách thực hiện các bước này trên cả môi trường LEMP và LAMP.

Các bước cấu hình cho Nginx + PHP-FPM

Hãy bắt đầu bằng cách chỉnh sửa file php.ini mặc định để xác định múi giờ của server . Đây là một yêu cầu để chạy các ứng dụng Symfony và nó thường được comment về các cài đặt server mới.

Mở file /etc/php5/fpm/php.ini .

  • sudo nano /etc/php5/fpm/php.ini

Tìm kiếm dòng chứa date.timezone . Bỏ ghi chú chỉ thị bằng cách xóa ; ký ở đầu dòng và thêm múi giờ thích hợp cho ứng dụng của bạn. Trong ví dụ này, ta sẽ sử dụng Europe/Amsterdam , nhưng bạn có thể chọn bất kỳ múi giờ nào được hỗ trợ .

đã sửa đổi /etc/php5/fpm/php.ini
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Europe/Amsterdam 

Lưu file và thoát. Để áp dụng các thay đổi, hãy khởi động lại PHP.

  • sudo service php5-fpm restart

Tiếp theo, ta cần thay thế file cấu hình trang web mặc định bằng file được tùy chỉnh để phục vụ ứng dụng Symfony. Trước tiên, hãy tạo bản backup cấu hình trang web mặc định hiện tại.

  • cd /etc/nginx/sites-available
  • sudo mv default default-bkp

Tạo một file mới để thay thế file cũ.

  • sudo nano /etc/nginx/sites-available/default

Dán nội dung sau vào file . Đừng quên thay thế các giá trị server_name để phản ánh domain server hoặc địa chỉ IP của bạn.

/ etc / nginx / sites-available / default
  • server {
  • server_name example.com www.example.com your_server_ip;
  • root /var/www/todo-symfony/web;
  • location / {
  • # try to serve file directly, fallback to app.php
  • try_files $uri /app.php$is_args$args;
  • }
  • location ~ ^/app\.php(/|$) {
  • fastcgi_pass unix:/var/run/php5-fpm.sock;
  • fastcgi_split_path_info ^(.+\.php)(/.*)$;
  • include fastcgi_params;
  • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  • # Prevents URIs that include the front controller. This will 404:
  • # http://domain.tld/app.php/some-path
  • # Remove the internal directive to allow URIs like this
  • internal;
  • }
  • error_log /var/log/nginx/symfony_error.log;
  • access_log /var/log/nginx/symfony_access.log;
  • }

Lưu file và thoát. Để áp dụng các thay đổi, hãy khởi động lại Nginx.

  • sudo service nginx restart

Các bước cấu hình cho Server Web Apache + PHP5

Hãy bắt đầu bằng cách chỉnh sửa file php.ini mặc định để xác định múi giờ của server . Đây là một yêu cầu để chạy các ứng dụng Symfony và nó thường được comment về các cài đặt server mới.

Mở file /etc/php5/apache2/php.ini :

  • sudo nano /etc/php5/apache2/php.ini

Tìm kiếm dòng chứa date.timezone . Bỏ ghi chú chỉ thị bằng cách xóa ; ký ở đầu dòng và thêm múi giờ thích hợp cho ứng dụng của bạn. Trong ví dụ này, ta sẽ sử dụng Europe/Amsterdam , nhưng bạn có thể chọn bất kỳ múi giờ nào được hỗ trợ .

đã sửa đổi /etc/php5/fpm/php.ini
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Europe/Amsterdam 

Lưu file và thoát. Bây giờ ta cần thay thế file cấu hình trang web mặc định bằng file tùy chỉnh, được điều chỉnh để phục vụ ứng dụng Symfony. Tạo bản backup cấu hình trang web mặc định hiện tại.

  • cd /etc/apache2/sites-available
  • sudo mv 000-default.conf default-bkp.conf

Tạo một file mới để thay thế file cũ.

  • sudo nano /etc/apache2/sites-available/000-default.conf

Dán nội dung sau vào file .

/etc/apache2/sites-available/000-default.conf
 <VirtualHost *:80>      DocumentRoot /var/www/todo-symfony/web     <Directory /var/www/todo-symfony/web>         AllowOverride None         Order Allow,Deny         Allow from All          <IfModule mod_rewrite.c>             Options -MultiViews             RewriteEngine On             RewriteCond %{REQUEST_FILENAME} !-f             RewriteRule ^(.*)$ app.php [QSA,L]         </IfModule>     </Directory>      # uncomment the following lines if you install assets as symlinks     # or run into problems when compiling LESS/Sass/CoffeScript assets     # <Directory /var/www/project>     #     Options FollowSymlinks     # </Directory>      ErrorLog /var/log/apache2/symfony_error.log     CustomLog /var/log/apache2/symfony_access.log combined </VirtualHost>  

Nếu bạn đang sử dụng domain để truy cập server của bạn thay vì chỉ địa chỉ IP, bạn có thể tùy chọn xác định giá trị ServerNameServerAlias , như được hiển thị bên dưới. Nếu không, bạn có thể bỏ qua chúng.

/etc/apache2/sites-available/000-default.conf
 <VirtualHost *:80>     ServerName example.com     ServerAlias www.example.com      DocumentRoot /var/www/todo-symfony/web . . . 

Lưu file và thoát. Ta cũng cần bật mod_rewrite cho Apache.

  • sudo a2enmod rewrite

Để áp dụng tất cả các thay đổi, hãy khởi động lại Apache.

  • sudo service apache2 restart

Bước 7 - Truy cập ứng dụng

Server của bạn đã sẵn sàng để phục vụ ứng dụng Symfony demo. Truy cập http:// your_server_ip trong trình duyệt của bạn và bạn sẽ thấy một trang như sau:

Xem trước ứng dụng việc cần làm của Symfony

Bạn có thể sử dụng biểu mẫu để tạo nhiệm vụ mới và kiểm tra chức năng của ứng dụng.

Kết luận

Việc triển khai bất kỳ ứng dụng nào cho quá trình production đòi hỏi sự chú ý đặc biệt đến các chi tiết, chẳng hạn như tạo một user database chuyên dụng với quyền truy cập hạn chế và đặt quyền folder phù hợp trên folder ứng dụng. Các bước này là cần thiết để tăng cường bảo mật server và ứng dụng trên môi trường production . Trong hướng dẫn này, ta đã thấy các bước cụ thể cần thực hiện để triển khai thủ công ứng dụng Symfony cơ bản để production trên server Ubuntu 14.04.


Tags:

Các tin liên quan

Cách triển khai Hugo Site sang Sản xuất với Git Hooks trên Ubuntu 14.04
2015-11-12
Cách cài đặt và sử dụng Hugo, Trình tạo trang web tĩnh, trên Ubuntu 14.04
2015-11-09
Cách tạo thiết lập HAProxy khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-11-05
Cách cài đặt Elasticsearch 1.7, Logstash 1.5 và Kibana 4.1 (ELK Stack) trên Ubuntu 14.04
2015-11-04
Cách cài đặt và cấu hình Elasticsearch trên Ubuntu 14.04
2015-10-26
Cách thiết lập server HAProxy khả dụng cao với các IP được lưu giữ và nổi trên Ubuntu 14.04
2015-10-23
Cách cài đặt Cassandra và chạy một cụm node đơn trên Ubuntu 14.04
2015-10-21
Cách tạo thiết lập tính khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-10-20
Cách tạo thiết lập tính khả dụng cao với Heartbeat và IP nổi trên Ubuntu 14.04
2015-10-20
Cách cài đặt và cấu hình server Salt Master và Minion trên Ubuntu 14.04
2015-10-05