Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

やったこと

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした