Rails 应用程序部署和 Nginx 文件权限

Rails application deployment and Nginx file permissions

我刚刚使用 Capistrano 设置了我的应用程序并将其部署到 /srv/my_app_name。但是,当我尝试访问我的应用程序时,我收到 403 Forbidden nginx/1.6.2 错误。我的 Nginx 在 www-data 用户下运行,但现在我试图了解应该为我的应用程序文件夹授予 Nginx 哪些访问权限。在我的 /var/log/nginx/error.log 文件中我有这个:

015/03/01 09:42:16 [error] 19451#0: *1 directory index of "/srv/my_app_name/current/public" is forbidden, client ...

这是 /srv 文件夹的 ls -l 命令的结果:

drwxrwxr-x   3 root deploy  4096 Feb 28 16:04 srv

namei -lm /srv/my_app_name/current/public/ 命令的结果:

# namei -lm /srv/my_app_name/current/public/
f: /srv/my_app_name/current/public/
drwxr-xr-x root   root   /
drwxrwxr-x root   deploy srv
drwxrwxr-x deploy deploy my_app_name
lrwxrwxrwx deploy deploy current -> /srv/my_app_name/releases/20150301140926
drwxr-xr-x root   root     /
drwxrwxr-x root   deploy   srv
drwxrwxr-x deploy deploy   my_app_name
drwxrwxr-x deploy deploy   releases
drwxrwxr-x deploy deploy   20150301140926
drwxrwxr-x deploy deploy public

我的应用 Nginx 配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    passenger_enabled on;
    rails_env production;
    # root /srv/my_app_name/;
    root /srv/my_app_name/current/public;

    # Make site accessible from http://localhost/
    server_name localhost staging.my_app_name.de www.staging.my_app_name.de;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules
    }
}

我以前的应用程序已部署到 /var/www 并运行良好,但我了解到它不是将应用程序用作服务的最佳位置,因此决定将此应用程序放在更合适的文件夹中,但现在我被文件权限卡住了。

问题:

  1. 我应该只将 www-data 的某些权限添加到 public 文件夹 (/srv/my_app_name/current/public),还是添加到整个应用程序文件夹 (/srv/my_app_name) ?

  2. 什么是正当权利?我目前使用 deploy 用户进行部署,即添加到 deploy 组。

  3. 如何添加这些权限(我的意思是命令,因为我在 Linux 文件权限方面不是很好)?

原来是我的nginx配置不对。出于某种原因,这个工作完美:

server {
    listen 80 default_server;
    passenger_enabled on;
    passenger_app_env staging;
    root /srv/my_app_name/current/public;
    server_name localhost other_hosts;
}