LoginSignup
46
57

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-16

やったこと

表題の通りですが、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モードにしても解決でした。

参考

46
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
57