Giới thiệu

Symfony là một khung công tác web mã nguồn mở được viết bằng PHP, thích hợp cho việc xây dựng các dự án có kích thước bất kỳ. 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 bạn.

Hướng dẫn này sẽ bao gồm các bước cần thiết để triển khai một ứng dụng Symfony cơ bản theo cách thủ công trên máy chủ Ubuntu 14.04. Chúng ta sẽ xem cách cấu hình đúng máy chủ, xem xét các biện pháp bảo mật và hiệu suất để thực hiện một thiết lập sẵn sàng cho sản xuất.

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.

Điều kiện tiên quyết

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

  • Một Ubuntu 14.04 mới chạy ĐÈN hoặc là LEMP
  • Người dùng không phải root sudo mà bạn có thể thiết lập bằng cách làm theo Thiết lập máy chủ ban đầu hướng dẫ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ó các nhu cầu cụ thể của riêng mình. Để đơn giản, chúng ta sẽ sử dụng một ứng dụng mẫu cần làm được xây dựng với Symfony. Bạn có thể tìm thấy mã nguồn của nó trên GitHub.

Bước 1 - Cài đặt máy chủ phụ thuộc

Trong bước này, chúng tôi sẽ cài đặt các phụ thuộc máy chủ.

Bắt đầu bằng cách cập nhật bộ đệm cache của trình quản lý gói.

sudo apt-get update

Chúng ta cần git để kiểm tra các tệp ứng dụng, acl để thiết lập quyền truy cập thư mục 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, chúng tôi sẽ cần composer để tải xuống các ứng dụng phụ thuộc. Để cài đặt composer toàn hệ thống, chạy:

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

Bây giờ bạn đã sẵn sàng để đi.

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

Hãy bắt đầu bằng cách thiết lập MySQL của bạn sẵn sàng cho sản xuất. Đối với bước tiếp theo, bạn sẽ cần mật khẩu cho nguồn gốc Tài khoản MySQL. Đảm bảo bạn đã thiết lập MySQL một cách an toàn (như được nêu chi tiết trong bước 2 của ĐÈN và LEMP hướng dẫn).

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

Đặt Bộ sưu tập và Charset mặc định

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

Mở tập tin /etc/mysql/my.cnf với trình soạn thảo dòng lệnh yêu thích của bạn.

sudo nano /etc/mysql/my.cnf

Bây giờ, tìm [mysqld] khối. Thêm collation-servercharacter-set-server tùy chọn 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 một người dùng và một cơ sở dữ liệu cho ứng dụng

Bây giờ chúng ta cần tạo một cơ sở dữ liệu MySQL và một người dùng cho ứng dụng của chúng ta.

Đầu tiên, truy cập vào máy khách MySQL bằng cách sử dụng MySQL nguồn gốc tài khoản.

mysql -u root -p

Bạn sẽ được yêu cầu nhập mật khẩu. Đây phải là mật khẩu bạn đã sử dụng khi chạy mysql_secure_installation.

Bây giờ, tạo cơ sở dữ liệu ứng dụng.

CREATE DATABASE todo;

OutputQuery OK, 1 row affected (0.00 sec)

Cơ sở dữ liệu hiện đã được tạo. Bước tiếp theo là tạo một người dùng MySQL và cung cấp cho họ quyền truy cập vào cơ sở dữ liệu mới được tạo của chúng tôi.

CREATE USER 'todo-user'@'localhost' IDENTIFIED BY 'todo-password';

OutputQuery OK, 0 rows affected (0.00 sec)

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

Chúng tôi vẫn cần cấp cho người dùng quyền này qua cơ sở dữ liệu ứng dụng của chúng tôi. Đ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 todo-user sử dụng tất cả các đặc quyền trên tất cả các bảng bên trong todo cơ sở dữ liệu. Để á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 ứng dụng khách MySQL.

quit;

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

mysql -u todo-user -p

Bạn có thể kiểm tra cơ sở dữ liệu mà người dùng này có quyền truy cập vào:

SHOW DATABASES;

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

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

Điều này có nghĩa là người dùng mới đã được tạo thành công với các đặc quyền phù hợp. Bạn chỉ nên xem hai cơ sở dữ liệu: information_schematodo.

Bây giờ bạn có thể thoát khỏi máy khách MySQL.

quit;

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

Triển khai là một chủ đề mở rộng do tính chất độc đáo của hầu hết các ứng dụng, ngay cả khi chúng tôi chỉ xem xét các dự án Symfony. Thật khó để khái 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 cơ sở dữ liệu hoặc chạy các lệnh thiết lập bổ sung.

Để đơn giản hóa luồng hướng dẫn, chúng ta sẽ sử dụng một ứng dụng demo cơ bản được xây dựng với 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 phụ thuộc vào nhu cầu ứng dụng của bạn.

Ứng dụng của chúng tôi 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 công việc cần làm được lưu trữ trong cơ sở dữ liệu MySQL. Mã nguồn có sẵn trên GitHub.

Chúng 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 thư mục gốc của ứng dụng của chúng ta. Sau đó, chúng tôi sẽ cấu hình máy chủ web cho phù hợp. Đối với hướng dẫn này, chúng ta sẽ sử dụng /var/www/todo-symfony, vì vậy hãy tạo thư mục đó ngay bây giờ.

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

Trước khi nhân bản kho lưu trữ, hãy thay đổi chủ sở hữu và nhóm thư mục để chúng tôi có thể làm việc với các tệp dự án bằng tài khoản người dùng thông thường của chúng tôi. Thay thếsammy với tên người dùng không phải root của bạn.

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

Bây giờ, di chuyển đến thư mục 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 các quyền trong thư mục

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

Chúng tôi sẽ sử dụng ACL (Danh sách điều khiển truy cập) để định 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 đối với các tệp và thư mục, đó là những gì chúng tôi cần để thiết lập quyền chính xác trong khi tránh sắp xếp quá chấp nhận.

Trước tiên, chúng tôi cần cho phép người dùng dữ liệu www truy cập vào các tập tin bên trong thư mục ứng dụng. Cung cấp cho người dùng này đọc + thực thi quyền (rX) trong toàn bộ thư mục.

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

Tiếp theo, chúng tôi cần thiết lập quyền đặc biệt cho cachelogs thư mục. Đưa cho đọc + ghi + thực thi quyền (rwX) cho người dùng dữ liệu www để cho phép máy chủ web chỉ viết trong các thư mục này.

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

Cuối cùng, chúng tôi sẽ xác định rằng tất cả các tệp mới được tạo bên trong app/cacheapp/logs các thư mục theo cùng lược đồ cho phép mà chúng ta vừa định nghĩa, với quyền đọc, ghi và thực hiện cho người dùng máy chủ web. Điều này được thực hiện bằng cách lặp lại setfacl lệnh chúng ta vừa chạy, nhưng lần này thêm -d Tùy chọn.

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 các quyền nào hiện đang được đặt trong một thư mục 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ừ đầu ra này, bạn có thể thấy rằng mặc dù thư mục app/cache được sở hữu bởi người dùng sammy, có một nhóm quyền bổ sung cho người dùng dữ liệu www. Các chỉ thị mặc định cho thấy các quyền mà các tệp mới được tạo bên trong thư mục này sẽ có.

Bước 5 - Thiết lập ứng dụng

Bây giờ chúng ta đã có các tệp ứng dụng, nhưng chúng ta vẫn cần phải cài đặt các phụ thuộc của dự án và cấu hình các tham 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ó nhật ký chi tiết và chi tiết hơn, nội dung được lưu trong bộ nhớ cache ít hơn và lỗi được hiển thị theo cách nổi bật để đơn giản hóa gỡ lỗi. Điều này rất 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 hành tốt cho môi trường sản xuất.

Để điều chỉnh ứng dụng cho sản xuất, chúng ta cần định nghĩa một biến môi trường để thông báo cho Symfony rằng chúng ta đang chạy ứng dụng trên một môi trường sản xuất.

export SYMFONY_ENV=prod

Tiếp theo, chúng ta cần phải cài đặt các phụ thuộc của dự án. Truy cập thư mục ứ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 nhắc cung cấp một số thông tin sẽ điền parameters.yml tập tin. Tệp này chứa thông tin quan trọng cho ứng dụng, như cài đặt kết nối cơ sở dữ liệu. Bạn có thể nhấn ENTER để chấp nhận các giá trị mặc định cho tất cả những điều này, ngoại trừ tên cơ sở dữ liệu, tên người dùng và mật khẩu. Đối với những người đó, hãy sử dụng các giá trị bạn đã tạo trong 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, chúng tôi có thể kiểm tra kết nối cơ sở dữ liệu với doctrine:schema:validate lệnh giao diện điều khiển.

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 có nghĩa là kết nối cơ sở dữ liệu đang hoạt động. Dòng FAIL được mong đợi vì chúng ta chưa tạo lược đồ cơ sở dữ liệu, 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!

Điều này sẽ tạo tất cả các bảng ứng dụng trong cơ sở dữ liệu được cấu hình, theo thông tin siêu dữ liệu 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à thực hiện di chuyển cơ sở dữ liệu thay thế. Trong trường hợp của chúng tôi, việc di chuyển là không cần thiết vì ứng dụng được cho là được cài đặt với một cơ sở dữ liệu sạch, trống.

Bây giờ bạn nên xóa 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 ra các tài sản ứ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 - Thiết lập Máy chủ Web

Điều duy nhất còn lại để làm là cấu hình máy chủ web. Điều này sẽ liên quan đến 2 bước: thiết lập date.timezone chỉ thị trong php.inivà cập nhật tệp cấu hình trang web mặc định (trên Apache hoặc Nginx) để phục vụ ứng dụng của chúng tôi.

Chúng ta sẽ xem cách thực hiện các bước này trên cả hai 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 mặc định php.ini để xác định múi giờ của máy chủ. Đây là một yêu cầu để chạy các ứng dụng Symfony, và nó thường được bình luận trên các cài đặt máy chủ mới.

Mở tập tin /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ý vào đầ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, chúng tôi sẽ sử dụng Europe/Amsterdam, nhưng bạn có thể chọn bất kỳ múi giờ được hỗ trợ.

modified /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, chúng ta cần phải thay thế tệp cấu hình trang web mặc định bằng một tệp tùy chỉnh để phục vụ một ứng dụng Symfony. Tạo bản sao lưu của cấu hình trang web mặc định hiện tại trước tiên.

cd /etc/nginx/sites-available

sudo mv default default-bkp

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

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

Dán nội dung sau vào tệp. Đừng quên thay thế server_name các giá trị để phản ánh tên miền máy chủ 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, khởi động lại Nginx.

sudo service nginx restart

Các bước cấu hình cho máy chủ web Apache + PHP5

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

Mở tập tin /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ý vào đầ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, chúng tôi sẽ sử dụng Europe/Amsterdam, nhưng bạn có thể chọn bất kỳ múi giờ được hỗ trợ.

modified /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ờ chúng ta cần phải thay thế tệp cấu hình trang web mặc định bằng một tệp tùy chỉnh, được thiết kế riêng để phục vụ một ứng dụng Symfony. Tạo bản sao lưu của 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 tệp mới để thay thế tệp cũ.

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

Dán nội dung sau vào tệp.

/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 tên miền để truy cập vào máy chủ của mình thay vì chỉ địa chỉ IP, bạn có thể tùy ý xác định ServerNameServerAlias các giá trị, 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. Chúng tôi 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

Máy chủ của bạn sẽ sẵn sàng để phục vụ ứng dụng Symfony demo. Chuyến thăm http://your_server_ip trong trình duyệt của bạn và bạn sẽ thấy một trang như sau:

Symfony To-Do App Preview

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

Phần kết luận

Việc triển khai bất kỳ ứng dụng nào đến sản xuất yêu cầu đặc biệt chú ý đến các chi tiết, chẳng hạn như tạo một người dùng cơ sở dữ liệu chuyên dụng với quyền truy cập hạn chế và thiết lập quyền truy cập thư mục đúng trên thư mục ứng dụng. Các bước này là cần thiết để tăng cường bảo mật máy chủ và ứng dụng trên môi trường sản xuất. Trong hướng dẫn này, chúng ta đã thấy các bước cụ thể cần thực hiện để triển khai một ứng dụng Symfony cơ bản theo cách thủ công để sản xuất trên máy chủ Ubuntu 14.04.