Configuring a Web Server

The preferred way to develop your Symfony application is to use Symfony Local Web Server.

Symfony アプリケーションを開発するための推奨される方法は、Symfony Local Web Server を使用することです。

However, when running the application in the production environment, you'll need to use a fully-featured web server. This article describes several ways to use Symfony with Apache or Nginx.

ただし、実稼働環境でアプリケーションを実行する場合は、完全な機能を備えた Web サーバーを使用する必要があります。この記事では、Apache または Nginx で Symfony を使用するいくつかの方法について説明します。

When using Apache, you can configure PHP as an Apache module or with FastCGI using PHP FPM. FastCGI also is the preferred way to use PHP with Nginx.

Apache を使用する場合、PHP を Apache モジュールとして構成するか、PHP FPM を使用して FastCGI で構成できます。 FastCGI は、Nginx で PHP を使用するための推奨される方法でもあります。
公開ディレクトリ

The public directory is the home of all of your application's public and static files, including images, stylesheets and JavaScript files. It is also where the front controller (index.php) lives.

パブリック ディレクトリは、画像、スタイルシート、JavaScript ファイルなど、アプリケーションのすべてのパブリック ファイルと静的ファイルのホームです。また、フロント コントローラー (index.php) が存在する場所でもあります。

The public directory serves as the document root when configuring your web server. In the examples below, the public/ directory will be the document root. This directory is /var/www/project/public/.

パブリック ディレクトリは、Web サーバーを構成するときにドキュメント ルートとして機能します。以下の例では、public/ ディレクトリがドキュメント ルートになります。このディレクトリは /var/www/project/public/ です。

If your hosting provider requires you to change the public/ directory to another location (e.g. public_html/) make sure you override the location of the public/ directory.

ホスティング プロバイダーが public/ ディレクトリを別の場所 (例: public_html/) に変更するよう要求する場合は、public/ ディレクトリの場所を上書きしてください。

Adding Rewrite Rules

The easiest way is to install the apache Symfony pack by executing the following command:

最も簡単な方法は、次のコマンドを実行して Apache Symfony パックをインストールすることです。
1
$ composer require symfony/apache-pack

This pack installs a .htaccess file in the public/ directory that contains the rewrite rules needed to serve the Symfony application.

このパックは、symfony アプリケーションを提供するために必要な書き換えルールを含む .htaccess ファイルを public/ ディレクトリにインストールします。

In production servers, you should move the .htaccess rules into the main Apache configuration file to improve performance. To do so, copy the .htaccess contents inside the <Directory> configuration associated to the Symfony application public/ directory (and replace AllowOverride All by AllowOverride None):

運用サーバーでは、パフォーマンスを向上させるために、.htaccess ルールを mainApache 構成ファイルに移動する必要があります。これを行うには、Symfony アプリケーションの public/ ディレクトリに関連付けられた構成内の .htaccess コンテンツをコピーします (そして、AllowOverride All を AllowOverride None に置き換えます)。
1
2
3
4
5
6
7
8
9
10
<VirtualHost *:80>
    # ...
    DocumentRoot /var/www/project/public

    <Directory /var/www/project/public>
        AllowOverride None

        # Copy .htaccess contents here
    </Directory>
</VirtualHost>

Apache with mod_php/PHP-CGI

The minimum configuration to get your application running under Apache is:

アプリケーションを Apache で実行するための最小構成は次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/public
    <Directory /var/www/project/public>
        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

Tip

ヒント

If your system supports the APACHE_LOG_DIR variable, you may want to use ${APACHE_LOG_DIR}/ instead of hardcoding /var/log/apache2/.

システムが APACHE_LOG_DIR 変数をサポートしている場合は、/var/log/apache2/ をハードコーディングする代わりに ${APACHE_LOG_DIR}/ を使用することをお勧めします。

Use the following optimized configuration to disable .htaccess support and increase web server performance:

次の最適化された構成を使用して、.htaccess サポートを無効にし、Web サーバーのパフォーマンスを向上させます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/public
    DirectoryIndex /index.php

    <Directory /var/www/project/public>
        AllowOverride None
        Order Allow,Deny
        Allow from All

        FallbackResource /index.php
    </Directory>

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    # optionally disable the fallback resource for the asset directories
    # which will allow Apache to return a 404 error when files are
    # not found instead of passing the request to Symfony
    <Directory /var/www/project/public/bundles>
        DirectoryIndex disabled
        FallbackResource disabled
    </Directory>
    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined

    # optionally set the value of the environment variables used in the application
    #SetEnv APP_ENV prod
    #SetEnv APP_SECRET <app-secret-id>
    #SetEnv DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"
</VirtualHost>

Caution

注意

Use FallbackResource on Apache 2.4.25 or higher, due to a bug which was fixed on that release causing the root / to hang.

Apache 2.4.25 以降では FallbackResource を使用してください。これは、そのリリースで修正されたバグにより root / がハングするためです。

Tip

ヒント

If you are using php-cgi, Apache does not pass HTTP basic username and password to PHP by default. To work around this limitation, you should use the following configuration snippet:

php-cgi を使用している場合、デフォルトでは、Apache は HTTP 基本ユーザー名とパスワードを PHP に渡しません。この制限を回避するには、次の構成スニペットを使用する必要があります。
1
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Using mod_php/PHP-CGI with Apache 2.4

In Apache 2.4, Order Allow,Deny has been replaced by Require all granted. Hence, you need to modify your Directory permission settings as follows:

Apache 2.4 では、Order Allow,Deny が Require all grant に置き換えられました。したがって、次のようにディレクトリのアクセス許可設定を変更する必要があります。
1
2
3
4
<Directory /var/www/project/public>
    Require all granted
    # ...
</Directory>

For advanced Apache configuration options, read the official Apache documentation.

高度な Apache 構成オプションについては、Apache の公式ドキュメントを参照してください。

Apache with PHP-FPM

To make use of PHP-FPM with Apache, you first have to ensure that you have the FastCGI process manager php-fpm binary and Apache's FastCGI module installed (for example, on a Debian based system you have to install the libapache2-mod-fastcgi and php7.4-fpm packages).

Apache で PHP-FPM を使用するには、最初に FastCGI プロセス マネージャー php-fpm バイナリと Apache の FastCGI モジュールがインストールされていることを確認する必要があります (たとえば、Debian ベースのシステムでは、libapache2-mod-fastcgi と php7 をインストールする必要があります。 4-fpm パッケージ)。

PHP-FPM uses so-called pools to handle incoming FastCGI requests. You can configure an arbitrary number of pools in the FPM configuration. In a pool you configure either a TCP socket (IP and port) or a Unix domain socket to listen on. Each pool can also be run under a different UID and GID:

PHP-FPM は、いわゆるプールを使用して着信 FastCGI リクエストを処理します。 FPM 構成で、任意の数のプールを構成できます。プールでは、リッスンする TCP ソケット (IP とポート) または Unix ドメイン ソケットのいずれかを構成します。各プールは、異なる UID および GID で実行することもできます。
1
2
3
4
5
6
7
8
9
10
; a pool called www
[www]
user = www-data
group = www-data

; use a unix domain socket
listen = /var/run/php/php7.4-fpm.sock

; or listen on a TCP socket
listen = 127.0.0.1:9000

Using mod_proxy_fcgi with Apache 2.4

If you are running Apache 2.4, you can use mod_proxy_fcgi to pass incoming requests to PHP-FPM. Configure PHP-FPM to listen on a TCP or Unix socket, enable mod_proxy and mod_proxy_fcgi in your Apache configuration, and use the SetHandler directive to pass requests for PHP files to PHP FPM:

Apache 2.4 を実行している場合は、mod_proxy_fcgi を使用して着信要求を PHP-FPM に渡すことができます。 TCP または Unix ソケットでリッスンするように PHP-FPM を構成し、Apache 構成で mod_proxy と mod_proxy_fcgi を有効にし、SetHandler ディレクティブを使用して PHP ファイルの要求を PHP FPM に渡します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    # Uncomment the following line to force Apache to pass the Authorization
    # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI
    #
    # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    # For Apache 2.4.9 or higher
    # Using SetHandler avoids issues with using ProxyPassMatch in combination
    # with mod_rewrite or mod_autoindex
    <FilesMatch \.php$>
        SetHandler proxy:fcgi://127.0.0.1:9000
        # for Unix sockets, Apache 2.4.10 or higher
        # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy
    </FilesMatch>

    # If you use Apache version below 2.4.9 you must consider update or use this instead
    # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1

    # If you run your Symfony application on a subpath of your document root, the
    # regular expression must be changed accordingly:
    # ProxyPassMatch ^/path-to-app/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1

    DocumentRoot /var/www/project/public
    <Directory /var/www/project/public>
        # enable the .htaccess rewrites
        AllowOverride All
        Require all granted
    </Directory>

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

PHP-FPM with Apache 2.2

On Apache 2.2 or lower, you cannot use mod_proxy_fcgi. You have to use the FastCgiExternalServer directive instead. Therefore, your Apache configuration should look something like this:

Apache 2.2 以下では、mod_proxy_fcgi を使用できません。代わりに FastCgiExternalServer ディレクティブを使用する必要があります。したがって、Apache 構成は次のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    AddHandler php7-fcgi .php
    Action php7-fcgi /php7-fcgi
    Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -host 127.0.0.1:9000 -pass-header Authorization

    DocumentRoot /var/www/project/public
    <Directory /var/www/project/public>
        # enable the .htaccess rewrites
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

If you prefer to use a Unix socket, you have to use the -socket option instead:

Unix ソケットを使用する場合は、代わりに -socket オプションを使用する必要があります。
1
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.4-fpm.sock -pass-header Authorization

Nginx

The minimum configuration to get your application running under Nginx is:

Nginx でアプリケーションを実行するための最小構成は次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
server {
    server_name domain.tld www.domain.tld;
    root /var/www/project/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    # optionally disable falling back to PHP script for the asset directories;
    # nginx will return a 404 error when files are not found instead of passing the
    # request to Symfony (improves performance but Symfony's 404 page is not displayed)
    # location /bundles {
    #     try_files $uri =404;
    # }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # optionally set the value of the environment variables used in the application
        # fastcgi_param APP_ENV prod;
        # fastcgi_param APP_SECRET <app-secret-id>;
        # fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name";

        # When you are using symlinks to link the document root to the
        # current version of your application, you should pass the real
        # application path instead of the path to the symlink to PHP
        # FPM.
        # Otherwise, PHP's OPcache may not properly detect changes to
        # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # for more information).
        # Caveat: When PHP-FPM is hosted on a different machine from nginx
        #         $realpath_root may not resolve as you expect! In this case try using
        #         $document_root instead.
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/index.php/some-path
        # Remove the internal directive to allow URIs like this
        internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

Tip

ヒント

If you use NGINX Unit, check out the official article about How to run Symfony applications using NGINX Unit.

NGINX Unit を使用している場合は、NGINX Unit を使用して Symfony アプリケーションを実行する方法に関する公式記事を確認してください。

Note

ノート

Depending on your PHP-FPM config, the fastcgi_pass can also be fastcgi_pass 127.0.0.1:9000.

PHP-FPM 構成によっては、fastcgi_pass が fastcgi_pass 127.0.0.1:9000 になることもあります。

Tip

ヒント

This executes only index.php in the public directory. All other files ending in ".php" will be denied.

これにより、公開ディレクトリ内の index.php のみが実行されます。 「.php」で終わる他のすべてのファイルは拒否されます。

If you have other PHP files in your public directory that need to be executed, be sure to include them in the location block above.

実行する必要のある他の PHP ファイルがパブリック ディレクトリにある場合は、それらを上記の場所ブロックに必ず含めてください。

Caution

注意

After you deploy to production, make sure that you cannot access the index.php script (i.e. http://example.com/index.php).

本番環境にデプロイしたら、index.phpscript (つまり、http://example.com/index.php) にアクセスできないことを確認してください。

For advanced Nginx configuration options, read the official Nginx documentation.

高度な Nginx 構成オプションについては、Nginx の公式ドキュメントを参照してください。