对于机架应用程序,如何使乘客独立服务于.erb文件的输出而不是发送.erb文件本身?
我有一个简单的config.ru机架应用程序 ,我只需要并运行机架服务器页面,以快速方便的方式提供动态页面。 这个config.ru应用程序由phusion passenger-standalone (内部使用nginx)提供服务。
正确处理和提供.erb文件,除非我明确地将.erb扩展名添加到URL(对于.erb文件)。 在这种情况下,服务器将向我发送.erb文件以供下载,而不是其输出。 显然我想避免这种情况。
为了更清楚:
服务器上的文件名为somefile.erb
这工作:
www.domain.com/somefile
这会发送.erb文件供下载 ☹:
www.domain.com/somefile.erb
我怎样才能解决这个问题? 这是我应该在应用程序级别 (机架式服务器页面) 或Web服务器级别 (nginx配置)管理的问题吗? 在这两种情况下我都需要一些帮助……
更新2:我认为这个机架式服务器页面文件可能是相关的 …但它只是一个疯狂的猜测,我不知道该改变什么..
更新1:粘贴乘客独立的Nginx配置文件。 Passenger-standalone
内部使用Nginx,但设置与/etc/nginx/nginx.conf
的系统范围Nginx /etc/nginx/nginx.conf
。 根据/usr/share/passenger/templates/standalone/config.erb
的文件,在每个乘客独立运行时重新生成乘客独立Nginx的默认设置。 以下是该文件:
############################################################## # Phusion Passenger Standalone uses a template file to # generate an Nginx configuration file. The original template # file can be found by running the following command: # # ls $(passenger-config about resourcesdir)/templates/standalone/config.erb # # You can create a copy of this template file and customize it # to your liking. Just make sure you tell Phusion Passenger Standalone # to use your template file by passing the --nginx-config-template # parameter. # # *** NOTE *** # If you customize the template file, make sure you keep an eye # on the original template file and merge any changes. # New Phusion Passenger features may require changes to the template # file. ############################################################## master_process on; worker_processes 1; daemon on; error_log '' = LVL_DEBUG %>info; pid ''; user ; user ; events { worker_connections 1024; } http { log_format debug '[$time_local] $msec "$request" $status conn=$connection sent=$bytes_sent body_sent=$body_bytes_sent'; include '/mime.types'; passenger_ruby ; passenger_ruby ; passenger_nodejs ; passenger_python ; passenger_root ''; passenger_abort_on_startup_error on; passenger_ctl cleanup_pidfiles ; passenger_ctl integration_mode standalone; passenger_ctl standalone_engine nginx; passenger_user_switching off; passenger_user ; passenger_default_user ; passenger_analytics_log_user ; passenger_user ; passenger_default_user ; passenger_analytics_log_user ; passenger_instance_registry_dir ''; passenger_data_buffer_dir ''; passenger_rolling_restarts on; passenger_resist_deployment_errors on; passenger_load_shell_envvars off; passenger_friendly_error_pages ; union_station_gateway_address ; union_station_gateway_port ; union_station_gateway_cert -; passenger_ctl '' ''; default_type application/octet-stream; types_hash_max_size 2048; server_names_hash_bucket_size 64; client_max_body_size 1024m; access_log off; keepalive_timeout 60; underscores_in_headers on; gzip on; gzip_comp_level 3; gzip_min_length 150; gzip_proxied any; gzip_types text/plain text/css text/json text/javascript application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/xml font/opentype image/svg+xml text/xml; # Default server entry for mass deployment mode. server { listen ; listen ssl; listen ssl; listen ; root '/standalone_default_root'; } server { listen ; listen ssl; listen ssl; listen ; server_name ; root ''; root '/public'; passenger_app_root ''; passenger_enabled on; passenger_app_env ; passenger_spawn_method ; passenger_app_type ; passenger_startup_file ; passenger_concurrency_model ; passenger_thread_count ; passenger_min_instances ; passenger_restart_dir ''; passenger_sticky_sessions on; passenger_sticky_sessions_cookie_name ''; passenger_vary_turbocache_by_cookie ''; union_station_support on; union_station_key ; ssl_certificate ; ssl_certificate_key ; passenger_meteor_app_settings ; passenger_env_var '' ''; # Rails asset pipeline support. location ~ "^/assets/.+-([0-9a-f]{32}|[0-9a-f]{64})\..+" { error_page 490 = @static_asset; error_page 491 = @dynamic_request; recursive_error_pages on; if (-f $request_filename) { return 490; } if (!-f $request_filename) { return 491; } } location @static_asset { gzip_static on; expires max; add_header Cache-Control public; add_header ETag ""; } location @dynamic_request { passenger_enabled on; } } passenger_pre_start ;
你在名为public
目录中有你的ERB页吗?
当Passenger处理请求时,Nginx将首先尝试在public
目录中找到匹配的文件,如果它发现将直接提供它而不将请求传递给您的应用程序,因为许多Web应用程序框架默认情况下将此目录用于静态文件(例如Rails,Sinatra)。
由于Rack Server Pages 的模板默认为public
,我怀疑这是你的情况。 当您使用扩展时,Passenger能够找到匹配的文件并将其作为响应直接发回。 没有扩展,Passenger将请求传递给应用程序,该应用程序能够映射到文件并按预期处理它。
由于看起来Rack Server Pages也使用views
作为默认模板目录,因此最简单的解决方案可能是创建一个具有此名称的目录并将模板移动到其中。 如果您有任何静态文件,您可以将它们public
并获得Nginx的速度优势。
如果您愿意,可以更改view_path
配置选项并完全使用其他目录。
如果要更改Passenger端的配置,可以查看static_files_dir
选项 。 您可能必须确保在这种情况下您选择的目录确实存在,即使它是空的。