部署 production 模式下怎样才能连接到 /public 下的文件?

richard020389 · May 03, 2013 · Last by bxd602 replied at February 06, 2015 · 4079 hits

需要在 xx 网下面做一个网页真实性认证,说要把一个 xxx.txt 文件放在网站根目录下(需要能够用 "域名/xxx.txt"访问)。 第一反应就是扔在在/public 下,然后放完了发觉连不上。。。 到网上逛了一圈,最后通过改 config.serve_static_assets = true 勉强连上了。 但是我总觉得哪里不太对。。。(不是说 nginx 会自己把 config.serve_static_assets 设成 false 的么?既然是 nginx 的话应该在 nginx.conf 里面写点什么对吧~)

我是 nginx+unicorn 的环境,求牛人指导正确的做法

config.serve_static_assets这个只是开启 rails 自身 server 处理静态文件的能力,一般来说静态文件都会交给 nginx 或 apache 等一些 http server 处理,这样做的好处是提高性能,让 rails server 只处理动态请求,不必浪费资源处理静态文件请求。在则 rails server 处理静态文件的性能完全不能和 nginx,apache 之类的比。

location ~* /.*\.(png|jpg|ico|css|js) {
 expires max;
 root /home/user/apps/current/public;
}

@mojidong 谢谢解释。不过我用你的你代码仍然是报 403 错误(我的 root 已经在 location 外面指定过了,还有什么要注意的呢?)

@richard020389 贴下你的 nginx 配置

@mojidong

user www-data; worker_processes 4; pid /var/run/nginx.pid;

events { worker_connections 768; # multi_accept on; }

http {

upstream xxx_release_server { server unix:/tmp/xxx_release.sock fail_timeout=0; } upstream xxx_server { server unix:/tmp/xxx.sock fail_timeout=0; }

server { listen 80; charset utf-8; server_name xxx.com;

root /root/xxx_production/current/public; location ~* ^/(images|javascripts|stylesheets|img)/ { access_log off; log_not_found off; expires max; break; } }

location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_buffering on; proxy_redirect off;

if (!-f $request_filename) { proxy_pass http://xxx_release_server; break; } }

} ## # Basic Settings ##

sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off;

# server_names_hash_bucket_size 64; # server_name_in_redirect off;

include /etc/nginx/mime.types; default_type application/octet-stream;

## # Logging Settings ##

access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;

## # Gzip Settings ##

gzip on; gzip_disable "msie6";

include /etc/nginx/conf.d/.conf; include /etc/nginx/sites-enabled/; }

@richard020389 看看你的 nginx error log

@richard020389 你这个八成是权限问题

@mojidong "GET /xxx.txt HTTP/1.1" 403 199 "-" 后面是 user-agent 貌似没有特别有用的信息。 另外,我发觉 favicon.ico 可以访问,但是 xxx.txt 和 422.html 都不能直接访问。 xxx.txt 的权限很高了,755 了已经

@mojidong 呃,favicon.ico 其实也不能访问,刚才可能哪里错觉了吧。信息少了点,然后我这里也略有点乱。我还是自己先看看吧。多谢帮忙~

#8 楼 @richard020389 你还需要确认你有目录访问权限

@zlx_star 恩,我后来重新看了一下 log,确实看到 permission denied 了,但是我也尝试过把整个项目目录到文件整个设成 777 了,仍然不能访问...等回头有空了我再好好整理一下。

#10 楼 @richard020389 有空的话能帮忙看一下:http://ruby-china.org/topics/10692这里的错么,谢谢了

#1 楼 @mojidong 有空的话能帮忙看一下:http://ruby-china.org/topics/10692这里的错么,谢谢了

@zqalyc 我的问题还没完全解决,只是靠 config.serve_static_assets 勉强混过这一段而已。我这边加了文件和目录权限仍然不行,你也许可以试试,理论上来说 755 就够了。(唉,我也是小白。。。)

先从 nginx 上开始找吧,nginx 默认应该能够提供静态文件的服务。把 rails 先停掉,直接请求静态资源,看看 access.log 的信息。

#13 楼 @richard020389 我今天也试着添加目录权限,不知是配错了还是咋的了,也是不行

第一行 user 改成自己试试?

#16 楼 @neo 哈哈 换上自己的 权限肯定对了 谢谢提醒

You need to Sign in before reply, if you don't have an account, please Sign up first.