Nginx
Nginx+Passenger 在 sub uri 上服務資產
我在https://projects.mydomain.com/app1/之類的子 uri 下提供 Rails 應用程序
但我的資產沒有載入。
這是我的 nginx 配置:
location ~ ^/app1(/.*|$) { root /srv/www/app1/current/public; passenger_base_uri /app1; passenger_app_root /srv/www/app1/current; passenger_document_root /srv/www/app1/current/public; passenger_enabled on; } location ~ ^/(assets)/ { root /srv/www/app1/current/public; gzip_static on; expires max; add_header Cache-Control public; }
應用程序已載入,所有 URL/PATH 都以 /app1/ 為前綴,但未載入資產。
https://projects.mydomain.com/app1/assets/application-123456.css不起作用
當我嘗試不帶前綴的資產路徑時,我可以看到資產存在:
https://projects.mydomain.com/assets/application-123456.css工作
任何的想法 ?
更新:
添加了error_log /var/log/nginx/error.log 調試; 當然,這是經過編輯的摘錄:
2015/12/18 11:15:44 [debug] 27187#0: *1 http process request line 2015/12/18 11:15:44 [debug] 27187#0: *1 http request line: "GET /app1/assets/application-123456.css HTTP/1.1" 2015/12/18 11:15:44 [debug] 27187#0: *1 http uri: "/app1/assets/application-123456789precompiledhash123456789.css" 2015/12/18 11:15:44 [debug] 27187#0: *1 http args: "" 2015/12/18 11:15:44 [debug] 27187#0: *1 http exten: "css" ... 2015/12/18 11:15:44 [debug] 27187#0: *1 test location: ~ "^/app1/assets" 2015/12/18 11:15:44 [debug] 27187#0: *1 using configuration "^/app1/assets" ... 2015/12/18 11:15:44 [debug] 27187#0: *1 http finalize request: -4, "/app1/assets/application-123456.css?" a:1, c:2 2015/12/18 11:15:44 [debug] 27187#0: *1 http request count:2 blk:0 2015/12/18 11:15:44 [debug] 27187#0: *1 http run request: "/app1/assets/application-123456.css?" 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream check client, write event:1, "/app1/assets/application-123456.css" 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream recv(): -1 (11: Resource temporarily unavailable) 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream request: "/app1/assets/application-123456.css?" 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream dummy handler 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream request: "/app1/assets/application-123456.css?" 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream dummy handler 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream request: "/app1/assets/application-123456.css?" 2015/12/18 11:15:44 [debug] 27187#0: *1 http upstream process header #... 2015/12/18 11:15:44 [debug] 27187#0: *1 recv: fd:26 1844 of 16384 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi status 404 "404 Not Found" 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "Status: 404 Not Found" ... 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "Content-Type: text/html; charset=utf-8" ... 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "Date: Fri, 18 Dec 2015 10:15:44 GMT" 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "Content-Length: 1564" 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "Connection: close" 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header: "X-Powered-By: Phusion Passenger" 2015/12/18 11:15:44 [debug] 27187#0: *1 http scgi header done 2015/12/18 11:15:44 [debug] 27187#0: *1 uploadprogress error-tracker error: 0 2015/12/18 11:15:44 [debug] 27187#0: *1 xslt filter header 2015/12/18 11:15:44 [debug] 27187#0: *1 HTTP/1.1 404 Not Found Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Status: 404 Not Found ... Date: Fri, 18 Dec 2015 10:15:44 GMT X-Powered-By: Phusion Passenger Server: nginx + Phusion Passenger Content-Encoding: gzip
作為附加資訊,當我在這個 nginx 位置指令中嘗試用別名替換根指令時,我得到 403。
location ~ ^/app1/assets { alias /srv/www/app1/current/public/assets; #root /srv/www/app1/current/public; gzip_static on; # to serve pre-gzipped version expires max; add_header Cache-Control public; passenger_enabled on; }
我嘗試了*^/app1/assets/.* 之*類的正則表達式,但仍然無法正常工作。(別名為 403 禁止)
更新2:
2015/12/18 15:38:49 [debug] 878#0: *1 test location: ~ "^/app1/assets/(.+)$" 2015/12/18 15:38:49 [debug] 878#0: *1 using configuration "^/app1/assets/(.+)$" 2015/12/18 15:38:49 [debug] 878#0: *1 http cl:-1 max:262144000 2015/12/18 15:38:49 [debug] 878#0: *1 rewrite phase: 3 ... 2015/12/18 15:38:49 [debug] 878#0: *1 content phase: 16 2015/12/18 15:38:49 [debug] 878#0: *1 http script copy: "/srv/www/app1/current/public/assets/" 2015/12/18 15:38:49 [debug] 878#0: *1 http script capture: "application-123456.css/" 2015/12/18 15:38:49 [debug] 878#0: *1 open index "/srv/www/app1/current/public/assets/application-123456.css/index.html" Tried to add an index directive, not working (404). Tried to add a try_files, still have a /index.html added at the end, therefore having same 404.
得到了朋友的幫助。這是如何工作的:
server { listen *:80; listen [::]:80; server_name projects.mydomain.com; server_tokens off; return 301 https://$server_name$request_uri; } server{ listen 0.0.0.0:443 ssl; listen [::]:443; server_name projects.gdurelle.com; server_tokens off; location ~ ^/app1(/.*|$) { alias /srv/www/app1current/public$1; passenger_base_uri /app1; passenger_app_root /srv/www/app1/current; passenger_document_root /srv/www/app1/current/public; passenger_enabled on; } location ~ ^/app2(/.*|$) { alias /srv/www/app2/current/public$1; passenger_base_uri /app2; passenger_app_root /srv/www/app2/current; passenger_document_root /srv/www/app2/current/public; passenger_enabled on; } }