CentOS7にWebサーバーのNginxを個別インストールします。今ではクラウドやレンタルサーバーに入ってるものを使う機会が多いので、作業することはあまりありなく忘れちゃってました。その備忘録です。
リポジトリを追加してyumコマンドでインストールするだけ。なんでこんなかんたんなこと忘れるんだろう?
いまは、クラウド・レンタルサーバーのサービスでインスタンス・イメージが用意されています。
(管理画面で選んでクリックするだけで済む。)
このへんのインストール作業はしない傾向です。まずはそれを検討しましょう。
今回はあくまで、『個人の力でやる』ためのものです。
検証CnetOSバージョン | 7.7.1908 |
Nginxのインストール
Nginxはyumでインストールできますが、リポジトリを追加しないといけません。
/etc/yum.repos.d/
にリポジトリファイルを作成します。
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
(centos/7/$base...はCentOSのメジャー・バージョン番号)
インストールします。
yum install nginx
OS起動時に自動起動するように設定してnginxを起動しましょう。
systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
systemctl start nginx
ブラウザでWebサーバーにアクセスして、
このページが表示されたらOKです。
php-fpmインストール
PHPプログラムを使うならNginxはphp-fpmが必要です。yumコマンドでインストールします。
yum install php-fpm
yum install --enablerepo=remi,remi-php74 php-fpm
OS起動時に自動起動するように設定して起動しましょう。
systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
systemctl start php-fpm
ダウンロード先リポジトリに気をつける
リポジトリを指定しないとき、CentOS7に標準で入っているPHP5.6と同じリポジトリからインストールします。
PHP7のときはremiリポジトリからインストールします。
(remiはPHP7のパッケージ・リポジトリ)
もちろん、リポジトリでphp-fpmの最新バージョンはちがいます。
yum info php-fpm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp-srv2.kddilabs.jp
* epel: ftp.iij.ad.jp
* extras: ftp-srv2.kddilabs.jp
* remi-safe: ftp.riken.jp
* updates: ftp-srv2.kddilabs.jp
Available Packages
Name : php-fpm
Arch : x86_64
Version : 5.4.16
Release : 46.1.el7_7
Size : 1.4 M
Repo : updates/7/x86_64
Summary : PHP FastCGI Process Manager
URL : http://www.php.net/
License : PHP and Zend and BSD
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
: implementation with some additional features useful for sites of
: any size, especially busier sites.
yum info --enablerepo=remi,remi-php74 php-fpm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp-srv2.kddilabs.jp
* epel: ftp.iij.ad.jp
* extras: ftp-srv2.kddilabs.jp
* remi: mirror.sjc02.svwh.net
* remi-php74: mirror.sjc02.svwh.net
* remi-safe: mirror.sjc02.svwh.net
* updates: ftp-srv2.kddilabs.jp
Available Packages
Name : php-fpm
Arch : x86_64
Version : 7.4.2
Release : 1.el7.remi
Size : 1.8 M
Repo : remi-php74
Summary : PHP FastCGI Process Manager
URL : http://www.php.net/
License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
: implementation with some additional features useful for sites of
: any size, especially busier sites.
リポジトリはphpに合わせてください。
php-commonのバージョン違いでインストールに失敗します。
php-fpmってなんぞや?
php-fpmは、
PHPのFastCGI Process Manager
です。PHPプログラムを速く動かすためのWebサーバーの拡張機能。
(Apache httpdでも使える。)
Nginx + php-fpmでは、
Nginx | リバースプロキシサーバー |
php-fpm | Webサーバー |
と見たほうがしくみが分かりやすいです。
(Nginx + php-fpmでシステムとしての『Webサーバー』)
NginxはApacheなどほかのWebサーバーのリバースプロキシとして使うことが多い。
サイトにアクセスがあると、Nginxはphpプログラムの仕事をphp-fpmに丸投げし、結果(htmlなど)だけを受け取ってブラウザに返します。
じっさいNginxは、キャッシュやロードバランサーなどの機能がリバースプロキシとして重宝されてます。
ロードバランサーは、大きなWebシステムで複数のWebサーバーがあるとき、サイトアクセスの処理を各Webサーバーへ振り分ける。
PHPプログラムを動かす設定
Nginxの初期ページをphpプログラムに変更してみましょう。
/usr/share/nginx/html/index.htmlをコピーしてindex.phpファイルを用意します。
<?php
?>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx! <?php echo "index.php"; ?></h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
1-2行目を追加して
<?php
?>
15行目を変更しました。
<h1>Welcome to nginx! <?php echo "index.php"; ?></h1>
次に、php-fpmの設定ファイルを変更します。
/etc/php-fpm.conf
php-fpmの設定ファイルを編集してプロセス実行権限を変更します。(初期値はapache)
nginxの実行ユーザー・ユーザーグループを確認します。
groups nginx
nginx : nginx
/etc/php-fpm.confの設定を変更しましょう。
; RPM: apache user chosen to provide access to the same directories as httpd
;user = apache
user = nginx
; RPM: Keep a group allowed to write in log dir.
;group = apache
group = nginx
設定を反映させます。
systemctl reload php-fpm
php-fpmのプロセスを確認します。
ps -auxf | grep nginx
root 4486 0.0 0.0 112712 964 pts/1 S+ 10:48 0:00 \_ grep --color=auto nginx
root 1081 0.0 0.0 46448 1128 ? Ss 09:15 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1085 0.0 0.1 46856 2160 ? S 09:15 0:00 \_ nginx: worker process
nginx 4372 0.0 0.3 265772 6184 ? S 10:30 0:00 \_ php-fpm: pool www
nginx 4373 0.0 0.3 265772 6184 ? S 10:30 0:00 \_ php-fpm: pool www
nginx 4374 0.0 0.3 265772 6184 ? S 10:30 0:00 \_ php-fpm: pool www
nginx 4375 0.0 0.3 265772 6184 ? S 10:30 0:00 \_ php-fpm: pool www
nginx 4376 0.0 0.3 265772 6188 ? S 10:30 0:00 \_ php-fpm: pool www
nginxユーザーで起動していればOK。
/etc/nginx/conf.d/default.conf
nginxの初期ページのデフォルトホスト設定も変更しましょう。
nginxのホスト設定にはphp-fpmの設定がすでにあり、コメント化されています。そのコメントを外します。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
そしてindexをhtmlからphpに変えます。
location / {
root /usr/share/nginx/html;
# index index.html index.htm;
index index.php;
}
設定を反映させます。
systemctl reload nginx
デフォルト設定で失敗
『よっしゃ。これでイケる!』と思いましたが、index.phpファイルをダウンロードしようとして失敗します。
nginxのエラーログを見ます。
2020/01/26 11:58:27 [error] 4899#4899: *21 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.33.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "other.test"
ありました、エラーが。もう一度、設定を確認します。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
スクリプトファイルのパス(/scripts...)が間違ってますね?
rootパスも間違ってるし。そこでパスを修正します。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
$document_rootはWebサーバーの公開ディレクトリのルート。
(rootで設定した値)
あと、"root /usr/share/nginx/html;" はほかでも使っているので、ひとつ上の階層(server{})に移しましょう。
完成したdefault.confです。
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
# index index.html index.htm;
index index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
"systemctl reload nginx"して、ブラウザからアクセスします。
上手くいきました。今回のnginx+php-fpmの設定は初期ページを表示するための最低限です。
その他の設定は必要になったら追加・変更していきましょう。