nginxでホームディレクトリを公開ディレクトリに設定するふ

  • 31
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

やったこと

表題の通りですが、nginxを使って、デフォルトの公開用ディレクトリでなく、
下記のようなホームディレクトリに用意した、publicディレクトリを公開ディレクトリにすること
※ハマッたので、記載

前提

  • nginxインスト済み

nginx側の設定

/etc/nginx/conf.d/hogehoe.conf
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モードにしても解決でした。

参考