2013-03-25 8 views
5

Obecna aplikacja, którą mam uruchomiony, działa dobrze na produkcji na swoim serwerze ubuntu. Ale teraz musiałem skonfigurować serwer Red Hat Enterprise Linux 5.5, aby wdrożyć aplikację i mam pewne problemy. Przede wszystkim niektóre Specyfikacja:Zasoby nie ładowane w produkcji dla aplikacji szyny

  • szynach wersja: 3.2.11
  • rubin: 1.9.3-p194
  • serwer HTTP nginx + jednorożec
  • zarządzania rubin środowisko z rbenv
  • metoda
  • wdrożyć: capistrano

Mój plik konfiguracyjny nginx.conf i jednorożca oparty jest na filmach Ryana Bate'a. Więc udało mi się uzyskać prawie wszystko skonfigurowane. Mogę wdrożyć, połączyć się z bazą danych itp. Jednak po odwiedzeniu strony mojej aplikacji nie można załadować wszystkich zasobów. A kiedy wchodzę do mojej konsoli, mówi, że nie udało im się z powodu błędu 403 Forbidden. Sprawdziłem, a zasoby są we właściwym miejscu: apps/my_app/shared/assets. Ale ciągle dostaję ten błąd 403.

Co próbowałem dotąd:

  • sprawdzane uprawnienia do folderów nadrzędnych i rzeczywistych plików aktywów. Wszyscy mieli co najmniej uprawnienia do odczytu dla każdego
  • zmienił config.assets.compile do prawdziwych
  • następnie instrukcjami tutaj rails deployment using nginx & unicorn: 403 forbidden error, który zaleca usunięcie plików domyślnych w conf.d. i symlinking mój własny plik konfiguracyjny do nginx/etc/nginx/conf.d. w przeciwieństwie do .../witryn włączoną

wszelkich myśli i idei dlaczego Dostaję 403?

Edit 1: dodaj plik /etc/nginx/nginx.conf

Nie wiem, czy to pomoże, ale to, co plik nginx.conf (w/etc/nginx) wygląda (nie moim zwyczaju plik nginx):

events { 
    worker_connections 1024; 
} 


#---------------------------------------------------------------------- 
# HTTP Core Module 
# 
# http://wiki.nginx.org/NginxHttpCoreModule 
# 
#---------------------------------------------------------------------- 

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

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
        '$status $body_bytes_sent "$http_referer" ' 
        '"$http_user_agent" "$http_x_forwarded_for"'; 

access_log /var/log/nginx/access.log main; 

sendfile  on; 
#tcp_nopush  on; 

#keepalive_timeout 0; 
keepalive_timeout 65; 

#gzip on; 

# 
# The default server 
# 
server { 
    listen  80; 
    server_name _; 

    #charset koi8-r; 

    #access_log logs/host.access.log main; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html index.htm; 
    } 

    error_page 404    /404.html; 
    location = /404.html { 
     root /usr/share/nginx/html; 
    } 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
    # 
    #location ~ \.php$ { 
    # proxy_pass http://127.0.0.1; 
    #} 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    # 
    #location ~ \.php$ { 
    # root   html; 
    # fastcgi_pass 127.0.0.1:9000; 
    # fastcgi_index index.php; 
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
    # include  fastcgi_params; 
    #} 

    # deny access to .htaccess files, if Apache's document root 
    # concurs with nginx's one 
    # 
    #location ~ /\.ht { 
    # deny all; 
    #} 
} 

# Load config files from the /etc/nginx/conf.d directory 
include /etc/nginx/conf.d/*.conf; 

} 

również zauważyłem, że pod /etc/nginx istnieją pliki nginx.conf i nginx.conf.default, czy ktoś zna różnicę? Może problem może tam być?

Edit 2: Dodaj wpis z pliku dziennika nginx

więc znalazłem to w pliku dziennika nginx. Być może jest to problem uprawnień, który można naprawić za pomocą chmod?

2013/03/24 20:50:53 [error] 10851#0: *5 open() "/home/webapp/apps/my_app/current/public/assets/application-db22bc3811b126e586f5e82e794e7ee4.css" failed (13: Permission denied) 

Edit 3: Aktualizacja /etc/nginx/nginx.conf

user nginx; 
worker_processes 2; 

# error_log logs/error.log; 
# error_log logs/error.log notice; 
# error_log logs/error.log info; 
error_log /var/log/nginx/error.log warn; 
pid /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include  mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
        '$status $body_bytes_sent "$http_referer" ' 
        '"$http_user_agent" "$http_x_forwarded_for"'; 

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

    sendfile  on; 
    #tcp_nopush  on; 

    keepalive_timeout 60; 

    gzip on; 

    include /etc/nginx/conf.d/*.conf; 

    # INSIDE THE /etc/ngin/conf.d/*.conf FILE # 

    server { 
    listen 80 default deferred; 
    # server_name example.com; 
    root /home/webapp/apps/my_app/current/public; 

    location ^~ /assets/ { 
     gzip_static on; 
     expires max; 
     add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_pass http://unicorn; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
    } 

} 

Odpowiedz

2

Więc udało mi się rozwiązać ten problem.W części porady w tym artykule: http://nginxlibrary.com/403-forbidden-error/

dla wszystkich katalogów prowadzących do wszystkich plików zasobów, ustawiam katalog uprawnień do chmod 775. A następnie dla wszystkich aktywów (application.js, itp.) Wewnątrz apps/my_app/shared/assets Dałem pliki to zezwolenie chmod 775.

I to wystarczyło. W artykule, do którego linkowałem, autor wspomina o konieczności, aby pliki zasobów miały uprawnienia do odczytu i wykonywania, a nie tylko do odczytu.

+0

czy wiesz, czy musisz wykonać chmod dla każdego wdrożenia/prekompilacji zasobów? – richsinn

+0

@richsinn Nie, nie musisz – Alfie