CentOS 7にnginxとWordPressをインストールしました。
WordPressをサブディレクトリの形でインストールして使えるようにするには少し設定に工夫が必要です。
以下、まとめてみました。
目次
nginxのインストール方法
デフォルトのCentOS 7ではnginxのリポジトリを参照しておりません。
そのため、yumでnginxをインストールするには、/etc/yum.repos.d/nginx.repoというファイルを事前に作成します。
1 2 3 4 5 |
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 |
その後、
1 |
#yum -y install nginx |
でnginxをインストールします。
CentOS 7からserviceコマンドは使えなくなりました。代わりにsystemctlコマンドを使います。
# systemctl disable xxx でxxxをサービスの登録から解除
# systemctl enable xxx でxxxをサービスに登録
#systemctl list-unit-files | grep xxxでサービスの登録確認
# systemctl start xxx でxxxを起動
# systemctl stop xxx でxxxを停止
# systemctl status xxx でxxxのステータスを確認
となります。
Apacheとnginxではポート80番が競合するので、Apacheが動いている場合はサービスの登録から解除して、停止しておきます。
1 2 |
[root@localhost ~]# systemctl disable httpd.service [root@localhost ~]# systemctl stop httpd.service |
その後、nginxをサービスに登録してから起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@localhost ~]# systemctl enable nginx.service ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service' [root@localhost ~]# systemctl start nginx.service [root@localhost ~]# systemctl status nginx.service nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled) Active: active (running) since 水 2014-09-17 16:52:03 JST; 11s ago Docs: http://nginx.org/en/docs/ Process: 5064 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Process: 5062 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 5066 (nginx) CGroup: /system.slice/nginx.service ├─5066 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.c... └─5067 nginx: worker process 9月 17 16:52:03 localhost.localdomain nginx[5062]: nginx: the configuration... 9月 17 16:52:03 localhost.localdomain nginx[5062]: nginx: configuration fil... 9月 17 16:52:03 localhost.localdomain systemd[1]: Started nginx - high perf... Hint: Some lines were ellipsized, use -l to show in full. |
nginxが起動したことを確認します。
ブラウザで、http://localhost/ と入力して、
「Welcome to nginx!」
と表示されれば、nginxのインストールは正常に完了しています。
WordPress関連のプログラムのインストール
yumで以下のプログラムをインストールします。
1 2 3 4 5 6 7 8 |
#yum -y install php #yum -y install mariadb #yum -y install mariadb-server #yum -y install php-mysql #yum -y install php-mbstring #yum -y install gd #yum -y install php-gd #yum -y install php-fpm |
データベースに関しては、CentOS 7から、MySQLではなくて、MariaDBというMySQL派生のオープンソースDBを使います。
最近は、MySQLではなくて、MariaDBを使っているプロジェクトが多いようです。
PHPの設定
PHPのバージョンを確認します。
1 2 3 4 |
[root@localhost ~]# php --version PHP 5.4.16 (cli) (built: Aug 6 2014 13:12:28) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies |
PHPのタイムゾーンを設定します。
/etc/php.iniを開いて、date.timezone = “Asia/Tokyo”と入力します。
1 2 3 4 |
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone ="Asia/Tokyo" |
タイムゾーンの設定を行っていないと、後述するnginxのエラーログに以下のように表示されることがあります。
FastCGI sent in stderr: “PHP message: PHP Warning: phpinfo(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone ‘UTC’ for now, but please set date.timezone to select your timezone. in /var/www/html/index.php on line 1” while reading response header from upstream, client: 127.0.0.1, server: localhost, request: “GET /index.php HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “localhost”
次に、php-fpmの設定を行います。
/etc/php-fpm.d/www.confを開いて、user、group、pm.max_requestsを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd ;user = apache user = nginx ; RPM: Keep a group allowed to write in log dir. ;group = apache group = nginx ・・・・・ ; The number of requests each child process should execute before respawning. ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 pm.max_requests = 500 |
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 |
[root@localhost ~]# systemctl enable php-fpm.service ln -s '/usr/lib/systemd/system/php-fpm.service' '/etc/systemd/system/multi-user.target.wants/php-fpm.service' [root@localhost ~]# systemctl start php-fpm.service [root@localhost ~]# systemctl status php-fpm.service php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled) Active: active (running) since 水 2014-09-17 16:03:40 JST; 36min ago Main PID: 1942 (php-fpm) Status: "Processes active: 0, idle: 7, Requests: 30, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/php-fpm.service ├─1942 php-fpm: master process (/etc/php-fpm.conf) ├─2765 php-fpm: pool www ├─2766 php-fpm: pool www ├─2767 php-fpm: pool www ├─2768 php-fpm: pool www ├─2769 php-fpm: pool www ├─3935 php-fpm: pool www └─3977 php-fpm: pool www 9月 17 16:03:40 localhost.localdomain systemd[1]: Started The PHP FastCGI P... 9月 17 16:07:40 localhost.localdomain python[3929]: SELinux is preventing /... ***** Plugin catchall ... 9月 17 16:07:41 localhost.localdomain python[3929]: SELinux is preventing /... ***** Plugin catchall ... 9月 17 16:39:29 localhost.localdomain systemd[1]: Started The PHP FastCGI P... Hint: Some lines were ellipsized, use -l to show in full. |
php-fpm は、localhost のポート9000で待ち受けする形で起動しました。
MariaDBの設定
MariaDBをサービスに登録して、起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost ~]# systemctl enable mariadb.service ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service' [root@localhost ~]# systemctl start mariadb.service [root@localhost ~]# systemctl status mariadb.service mariadb.service - MariaDB database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled) Active: active (running) since 水 2014-09-17 17:05:36 JST; 4s ago Process: 5424 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS) Process: 5395 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS) Main PID: 5423 (mysqld_safe) CGroup: /system.slice/mariadb.service ├─5423 /bin/sh /usr/bin/mysqld_safe --basedir=/usr └─5580 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql... 9月 17 17:05:34 localhost.localdomain mysqld_safe[5423]: 140917 17:05:34 my... 9月 17 17:05:34 localhost.localdomain mysqld_safe[5423]: 140917 17:05:34 my... 9月 17 17:05:36 localhost.localdomain systemd[1]: Started MariaDB database ... Hint: Some lines were ellipsized, use -l to show in full. |
wordpressのデータベースを作成して、ユーザーwordpressパスワードxxxyyyを設定し、権限を設定します。
1 2 3 4 |
# mysql -u root -p mysql> show databases; mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8; mysql> grant all privileges on wordpress.* to wordpress@localhost identified by 'xxxyyy'; |
WordPress本体のインストール
WordPress 本体は yum からはインストールできないようなので、本家のサイトから wget して展開します。
WordPress4.0 日本語版が最近出たのでそちらをインストールします。
1 2 3 4 5 6 7 8 9 |
WordPressを入手します。 #wget http://ja.wordpress.org/wordpress-4.0-ja.zip /var/www/wordpressに展開します。 #unzip wordpress-x.x.x-ja.zip #mv wordpress /var/www/ WordPressディレクトリ所有者をnginxに変更します。 #chown -R nginx:nginx /var/www/wordpress/ |
WordPressのデータベースの設定を行います。
1 2 3 4 5 6 7 8 |
#cd /var/www/wordpress/ #cp wp-config-sample.php wp-config.php #vi wp-config.php 以下を設定します。 define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress'); define('DB_PASSWORD', 'xxxyyy'); |
WordPressをサブディレクトリ形式でnginxで使えるようにする
以下の要件を実現します。
- http://localhost/ で/var/www/html/index.htmlが表示される。
- http://localhost/index.php で/var/www/html/index.phpが表示される。
- http://localhost/wordpress で/var/www/wordpressに設定したWordPressがサブディレクトリで表示される。
Apacheなら、以下の設定だけでOKですが、nginxでは少し苦労しました。
1 |
Alias /wordpress /var/www/wordpress |
nginxでは、/etc/nginx/conf.d/nginx.confを以下のように記述することで、上記の要件を実現することができます。
locationをネストしていることがポイントです。
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 |
server { listen 80 default_server; server_name localhost; access_log /var/log/nginx/host.access.log main; error_log /var/log/nginx/host.error.log warn; root /var/www/html; location / { try_files $uri $uri/ /index.html index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } location ^~ /wordpress { alias /var/www/wordpress; index index.php index.html index.htm; try_files $uri $uri/ /wordpress/index.php?$args; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(/wordpress)(/.*)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } } } |
上記のnginxのconfファイルの設定により、要件のすべてを満たすことができます。
Primary script unknownって何?locationにrootを記述してはダメ
nginxの設定でエラーが出る際には、いくつか修正ポイントがあります。
以下の通りにまとめてみました。
参考になればと思います。
1. nginxのaccess.logとerror.logは必ず生成するにしましょう。
何かあれば、必ずログの確認を行います。
2. Connection refusedというエラーが出ることがあります。
2014/09/16 14:49:41 [error] 8537#0: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: “GET / HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “localhost”
これは、localhostの9000番ポートへの接続ができていません。
php-fpmが起動できているかどうか確認します。
3. Primary script unknownというエラーが出ることがあります。
2014/09/16 16:19:57 [error] 12637#0: *1 FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream, client: 127.0.0.1, server: localhost, request: “GET /wordpress/index.php HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “localhost”
Primary script unknownというメッセージは必ず、SCRIPT_FILENAMEの設定ミスと関連しています。
SCRIPT_FILENAMEを見直しましょう。
以下の記述の場合、$document_rootが正しくないことがあります。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
4. locationにrootを記述してはダメ
locationブロックにrootを記述しても動きますが、推奨されません。
この記述は避けましょう。
5. “/etc/nginx/html/index.html” is not foundというエラーが出ることがあります。
2014/09/16 16:12:25 [error] 12402#0: *1 “/etc/nginx/html/index.html” is not found (2: No such file or directory), client: 127.0.0.1, server: localhost, request: “GET / HTTP/1.1”, host: “localhost”
6. 設定したことがないディレクトリ名がエラーログに記載されることがあります。
listen 80 default_server;
というようにdefault_serverを記述するとこのエラーは回避できます。
default_serverの記述すると、他のバーチャルホストの設定よりも優先されます。
7. directory index of xxxx is forbidden というエラーが出ることがあります。
2014/09/16 16:31:10 [error] 12780#0: *1 directory index of “/var/www/wordpress/” is forbidden, client: 127.0.0.1, server: localhost, request: “GET /wordpress/ HTTP/1.1”, host: “localhost”
上記のエラーが出たときは、以下の記述を追加すると回避できます。
index index.php index.html index.htm;
8. rewrite or internal redirection cycle while internally redirecting toというエラーが出ることがあります。
2014/09/16 19:10:15 [error] 18443#0: *1 rewrite or internal redirection cycle while internally redirecting to “/wordpress/index.php”, client: 127.0.0.1, server: localhost, request: “GET /wordpress/ HTTP/1.1”, host: “localhost”
これはrewriteの設定が間違えています。
設定を確認しましょう。
9. nginx.serviceの起動時にJob for nginx.service failed. See ‘systemctl status nginx.service’ and ‘journalctl -xn’ for details.というエラーが出ることがあります。
# systemctl restart nginx.service
Job for nginx.service failed. See ‘systemctl status nginx.service’ and ‘journalctl -xn’ for details.
confファイルの中で;(セミコロン)が抜けている個所がないかどうか確認してみてください。
nginx についてのおすすめの本
↓nginx についてのおすすめの本はコチラ
コメント
[…] urashita.com Centos 7にnginxとWordPressをサブディレクトリの形でインストールしてみました karakaram-blog お名前.com VPS […]