我很擅长使用nginx。我想用它来提供静态内容,以减少rails服务器上的负载。这似乎是一项相当简单的任务,但我找不到适合我的解决方案。
我希望nginx提供存在于rails应用程序目录中 public 目录中的静态文件。更确切地说:我在输入 http:/ [domainname] 时希望获得服务的目录中有一个 index.html 。相反,我只是得到默认的nginx index.html。我已经检查 thin 正在运行,当我查询 127.0.0.1:3000 时,我得到了我想要的页面。
所以这是 sites-available 目录中名为[domainname]的文件。
upstream rails {
server 127.0.0.1:3000; #This is where thin is waiting for connections
}
# HTTP server
server {
listen 80;
server_name [domainname];
set $app /home/projektor/website/app.[domainname];
root $app/public;
# Set a limit to POST data
client_max_body_size 8M;
# Errors generated by Rails
error_page 400 /400.html;
error_page 422 /422.html;
error_page 500 504 /500.html;
# Errors generated *outside* Rails
error_page 502 @502;
error_page 503 @503;
# If the public/system/maintenance.html file exists,
# return a 503 error, that ...
if (-f $document_root/system/maintenance.html) {
return 503;
}
# ... will serve the very same file. This construct
# is needed in order to stop the request before
# handing it to Rails.
location @503 {
rewrite ^ /system/maintenance.html break;
}
# When a 502 error occurs - that is, Rails is not
# running, serve the 502.html file
location @502 {
rewrite ^ /502.html break;
}
# Add client-side caching headers to static files
#
location ~ ^/(stylesheets|javascripts|images|system/avatars) {
expires 720h;
}
# Hand over the request to Rails, setting headers
# that will be interpreted by request.remote_ip,
# request.ssl? and request.host
#
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header Host $http_host;
proxy_redirect off;
# If the file exists as a static file serve it directly
if (-f $request_filename) {
break;
}
# Oh yeah, hand over the request to Rails! Yay! :-D
proxy_pass http://rails;
}
}
该文件基于this一个。
感谢您的帮助。
修改 我已经在上游部分为 0.0.0.0:3000 交换了 127.0.0.1:3000 。我还检查了site-available和sites-enabled中文件的所有权,它们都应该没问题。
我将return 503;
硬编码到位置指令中,似乎它永远不会匹配。它似乎总是匹配预先创建的默认配置。
答案 0 :(得分:1)
查看try_files文档中的Mongrel示例。这样的事情应该有效:
location / {
try_files /system/maintenance.html $uri $uri/index.html $uri.html @thin;
}
location @thin {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header Host $http_host;
proxy_redirect off;
# Oh yeah, hand over the request to Rails! Yay! :-D
proxy_pass http://rails;
}
答案 1 :(得分:1)
当我设置最新版本的NGINX时,让它正确指向我的rails应用程序的解决方案与完全配置完全相关。我在文档中找不到一些额外的步骤。它的表现与你的一样。我没有干净安装,但请耐心等待。
我在默认安装位置设置了一个名为sites-enabled的目录。这是来自apt存储库的debian安装,因此安装位置是/ etc / nginx和/ var / nginx。
mkdir /etc/nginx/sites-enabled /etc/nginx/sites-available
将网站的conf文件放在sites-available /
将此行添加到/etc/nginx/nginx.conf的底部
包括/ etc / nginx / sites-enabled / *;
查找并删除任何可能包含DEFAULT配置的引用,该引用告诉nginx实际加载此文件。这是什么给你nginx默认index.html(/etc/nginx/conf.d/default.conf)
grep -r" default.conf"的/ etc / nginx的
符号链接(man ln)您站点中的文件 - 可用于启用站点。
ln -s / etc / nginx / sites-available / myfilename / etc / nginx / sites-enabled / myfilename
测试您的配置。
/etc/init.d/nginx configtest
正确设置配置后,重新启动nginx
/etc/init.d/nginx restart
我无法记住,如果删除此引用或在步骤2中包含该行就足够了。如果您更新或评论此答案并给我结果,我可以尝试挖掘我采取的其他步骤。
我不认为这里的问题是你的实际配置。