正式名称は Apache HTTP Server でデーモンは httpd
。世界中でもっとも多く使われている OSS な Web サーバソフトウェア。コンピュータに Apache を入れると、そのコンピュータは Web サーバとしての仕事ができるようになる。稼働シェアの高いバージョンは 2.2 と 2.4 でデーモン名や設定ファイルの記述方法が異なる。「 LAMP 環境」の A は Apache の A 。
$ cd /etc/yum.repos.d
$ sudo wget https://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo
$ cd ~
$ sudo yum --enablerepo=epel-httpd24 install -y httpd24
$ chkconfig httpd24-httpd on
$ service httpd24-httpd start
$ sudo yum intall -y httpd
$ sudo service httpd start
$ sudo chkconfig httpd on
# 設定ファイル
$ vi /etc/httpd/conf/httpd.conf # CentOS など RedHat 系
$ vi /etc/apache2/sites-available/default.conf # MacOS や Debian 系
# ログファイル
$ less /var/log/httpd/error_log
Apache のバージョンや OS の情報を出力しないようにする
HTTPの応答ヘッダーに含まれるPHPバージョンを隠す方法
$ sudo sed -i -e "s/ServerSignature On/ServerSignature Off/g" /etc/httpd/conf/httpd.conf
$ sudo sed -i -e "s/ServerTokens OS/ServerTokens Prod/g" /etc/httpd/conf/httpd.conf
# PHP をインストールしていれば以下で PHP のバージョン秘匿もしとく
$ sudo sed -i -e "s/expose_php = On/expose_php = Off/g" /etc/php.ini
$ service httpd restart
# OS => Apache への実行時定義ファイル追記による環境変数セット
# httpd.conf などで ${DOMAIN} のように取得可能
#
$ echo "export DOMAIN='www.example.com'" >> /etc/sysconfig/httpd # RedHat 系
$ echo "export DOMAIN='www.example.com'" >> /etc/apache2/envvars # Debian 系
# Apache => CGI への SetEnv ディレクティブによる環境変数セット
# PHP の getenv() などで取得可能
#
$ sudo sed -i '$a\SetEnv DEV_MODE 1' /etc/httpd/conf/httpd.conf
WordPress, CakePHP, Laravel など .htaccess
による制御を行っている FW では必須の設定。
# ドキュメントルート変更
DocumentRoot "/var/www/public"
<Directory "/var/www/public">
<Directory "/var/www/public">
# Options Indexes FollowSymLinks
Options FollowSymLinks # ファイル一覧表示の禁止
# Order deny,allow
# Deny from all
AllowOverride All # .htaccess で全設定を上書き可能に
</Directory>
# こっちはキャッシュ無効化
EnableMMAP off
EnableSendfile off
# Apache 2.4 想定
<VirtualHost _default_:443>
SSLEngine on
ServerName localhost:443
SSLCertificateFile "${SRVROOT}/conf/ssl/server.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/server.key"
# DocumentRoot "${SRVROOT}/htdocs"
CustomLog "${SRVROOT}/logs/ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
<Directory "${SRVROOT}/htdocs">
Options Includes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
常時 SSL サイトに設定したのち 80 ポートアクセス ( HTTP ) を全て HTTPS へぶんなげ。.htaccess
でディレクトリ単位で指定できるが、通常アプリケーション全体に跨る話であり、かつソースコードで本番環境/試験環境の差分ファイルを運用するの面倒なのでこっちに書く方が楽。
# リライトモジュールを有効化 ( 通常されていると思うが ... )
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
# Redirect to HTTPS on access by HTTP.
ServerName www.example.com:80
RewriteEngine on
RewriteCond %{HTTP_HOST} (.*)\.example\.com
RewriteRule ^/(.*)$ https://www.example.com/$1 [R=301,L]
</VirtualHost>
LoadModule php7_module modules/libphp7.so
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php # add
AddType application/x-httpd-php-source .phps # add
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# モジュールのコメントアウトを外す
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# 最終行にでも追加
# / を http://example.com へプロキシ
# フォワードプロキシなら ProxyRequests On にする
#
ProxyRequests Off
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/