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 :
- Một server Ubuntu 14.04 mới chạy LAMP hoặc LEMP
- User sudo không phải root, bạn có thể cài đặt theo hướng dẫn Cài đặt server ban đầu
Đ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 LAMP và LEMP ).
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 .
[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;
OutputQuery 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';
OutputQuery 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';
OutputQuery 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;
OutputQuery 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_schema
và todo
.
Đế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
OutputCloning 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/cache
và app/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 cache
và logs
. 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/cache
và app/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 .
OutputCreating 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
OutputATTENTION: 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:create
và doctrine: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
OutputClearing 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
OutputDumping 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ợ .
[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.
- 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ợ .
[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 .
<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ị ServerName
và ServerAlias
, như được hiển thị bên dưới. Nếu không, bạn có thể bỏ qua chúng.
<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:
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.
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.042015-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