やったこと
表題の通りですが、nginxを使って、デフォルトの公開用ディレクトリでなく、
下記のようなホームディレクトリに用意した、publicディレクトリを公開ディレクトリにすること
※ハマッたので、記載
前提
- nginxインスト済み
nginx側の設定
server {
listen 80;
server_name hogehoge;
charset utf8;
root /var/www/hoge; # シンボリックリンク済み -> /home/hoge/project/public
#root /home/hoge/project/public;
index index.php;
client_max_body_size 128M;
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location ~* \.(gif|jpg|png)$ {
expires 30d;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_FILENAME $request_filename;
}
error_page 500 502 503 504 /error.html;
location = /error.html {
root /usr/share/nginx/html;
}
}
で、nginx起動
$ sudo service nginx start
とすると、
2015/08/16 22:27:27 [crit] 1917#0: *4 stat() "/home/hoge/project/public" failed (13: Permission denied), client: 192.168.33.1, server: hogehoge, request: "GET / HTTP/1.1", host: "hogehoge"
え、パーミッションエラーだと・・・
確かに、
/home/hoge
にnginxユーザーでアクセスするわけだし・・・
ということで、パーミッション変更…
# chmod o+x -R /home/hoge
# service nginx restart
が、
2015/08/16 22:27:27 [crit] 1917#0: *4 stat() "/home/hoge/project/public" failed (13: Permission denied), client: 192.168.33.1, server: hogehoge, request: "GET / HTTP/1.1", host: "hogehoge"
変わらず・・・
ホームディレクトリの所有グループにnginxユーザーを追加もやってみたが、変わらず…
で、もう少し調べてみると・・・SELinux might be blockingなんじゃないかと・・・
まずは、
# 状態確認
$ getenforce
Enforcing
以下のようにして、確認してもよいかも。
$ setenforce 0 #selinuxをオフにする
で、ブラウザからアクセスできるか。できたら、selinuxの設定漏れ。
で、自分のケースに話を戻すと、確かに、selinuxが有効になっていて、パーミッションエラーになった・・・
てことは、ポリシー設定がないから?
で、さっそく確認。
$ sudo cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx
module nginx 1.0;
require {
type httpd_t;
type user_home_t;
type usr_t;
class file { write open };
class dir { search open getattr };
}
#============= httpd_t ==============
#!!!! This avc can be allowed using one of the these booleans:
# httpd_read_user_content, httpd_enable_homedirs
allow httpd_t user_home_t:dir { search open getattr };
#!!!! This avc can be allowed using the boolean 'httpd_read_user_content'
allow httpd_t user_home_t:file open;
allow httpd_t user_home_t:file { write open };
allow httpd_t usr_t:file write;
ポリシーファイルを作成
$ sudo cat /var/log/audit/audit.log | audit2allow -M nginx
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i nginx.pp
して、適用
$ sudo semodule -i nginx.pp
完了後、再度サイトにアクセスすると今度はサイトが表示されました!
が、SELinuxがどうだったから何が起きていて、アクセスができていなかったのか、理解ができていない・・・まずは、備忘録にしときます。
追記…
やはり、selinuxが有効なのに、アクセス許可するポリシー設定がなかったため、アクセス制御に引っかかってしまっていたとうことでした。
今回は上記のように対応しましたが、そもそも、selinuxのモードは下記の通り。
- enforce
- pemissive
- disabled
無効にするならdisabled、selinuxは有効にするがアクセス許可し、ログ出力のみにするなら、pemissive、アクセス不許可ならenforce
ってことで、pemissiveモードにしても解決でした。