2012-05-17 28 views
283

Tôi cần phân phối ứng dụng của mình thông qua máy chủ ứng dụng của tôi tại 8080 và các tệp tĩnh của tôi từ thư mục mà không cần chạm vào máy chủ ứng dụng. Cấu hình nginx tôi có là một cái gì đó như thế này ...Nginx - tệp tĩnh phân phối nhầm lẫn với root & alias

# app server on port 8080 
    # nginx listens on port 8123 
    server { 
      listen   8123; 
      access_log  off; 

      location /static/ { 
        # root /var/www/app/static/; 
        alias /var/www/app/static/; 
        autoindex off; 
      } 


      location/{ 
        proxy_pass    http://127.0.0.1:8080; 
        proxy_set_header  Host    $host; 
        proxy_set_header  X-Real-IP  $remote_addr; 
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
      } 
    } 

Bây giờ, với cấu hình này, mọi thứ đều hoạt động tốt. Lưu ý rằng chỉ thị root được nhận xét.

Nếu tôi kích hoạt root và hủy kích hoạt alias - thiết bị sẽ ngừng hoạt động. Tuy nhiên, khi tôi xóa dấu sau /static/ khỏi số root, nó sẽ bắt đầu hoạt động trở lại.

Ai đó có thể giải thích những gì đang xảy ra. Ngoài ra, vui lòng giải thích rõ ràng và rõ ràng sự khác biệt giữa rootalias và mục đích của chúng là gì.

Trả lời

711

Tôi đã tìm thấy câu trả lời cho những nhầm lẫn của mình.

Có sự khác biệt rất quan trọng giữa số root và chỉ thị alias. Sự khác biệt này tồn tại theo cách đường dẫn được chỉ định trong root hoặc alias được xử lý.

Trong trường hợp chỉ thị root, đường dẫn đầy đủ được gắn vào thư mục gốc bao gồm phần vị trí, trong khi trong trường hợp chỉ thị alias, chỉ có phần của con đường KHÔNG bao gồm phần vị trí là được thêm vào bí danh.

Để minh họa:

Hãy nói rằng chúng tôi có cấu hình

 location /static/ { 
       root /var/www/app/static/; 
       autoindex off; 
     } 

Trong trường hợp này con đường cuối cùng mà Nginx sẽ lấy được sẽ

/var/www/app/static/static 

Điều này sẽ trở 404 từ không có static/ trong vòng static/

Điều này là do phần vị trí được nối vào đường dẫn được chỉ định trong root. Do đó, với root, cách chính xác là

 location /static/ { 
       root /var/www/app/; 
       autoindex off; 
     } 

Mặt khác, với alias, phần vị trí được giảm. Vì vậy, đối với cấu hình

 location /static/ { 
       alias /var/www/app/static/; 
       autoindex off; 
     } 

con đường cuối cùng sẽ chính xác được hình thành như

/var/www/app/static 

Xem tài liệu ở đây: http://wiki.nginx.org/HttpCoreModule#alias

+7

Việc tẩy chay của bạn đã giúp ích rất nhiều! Cảm ơn nhiều ! –

+27

Dấu gạch chéo trên đường dẫn bí danh là điều cần thiết! – mafrosis

+3

OMG, cảm ơn bạn rất nhiều rằng dấu gạch chéo cuối cùng đã khiến tôi mất nửa ngày. – notalentgeek

14

Chỉ cần một phụ lục nhanh chóng @ good_computer là câu trả lời rất hữu ích, tôi muốn thay thế cho thư mục gốc của URL bằng một thư mục, nhưng chỉ khi nó khớp với một thư mục con chứa các tệp tĩnh (mà tôi muốn giữ lại như là một phần của đường dẫn).

Ví dụ: nếu tệp được yêu cầu ở trong /app/js hoặc /app/css, hãy xem /app/location/public/[that folder].

Tôi đã làm việc này bằng cách sử dụng regex.

location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ { 
    alias /home/user/sites/app/public/$1; 
    access_log off; 
    expires max; 
} 
+1

Cảm ơn câu trả lời này. Tôi biết điều này là 3 năm sau đó, nhưng bất cứ ai có thể giải thích nếu có một hiệu suất và/hoặc sự cân bằng an ninh giữa việc sử dụng bí danh so với root? – Mina

25

Trong trường hợp của bạn, bạn có thể sử dụng root chỉ thị, vì $uri một phần của chỉ thị location là cùng với cuối cùng root phần chỉ thị.

Nginx documentation lời khuyên nó là tốt:
Khi vị trí phù hợp với phần cuối cùng của giá trị của chỉ thị:

location /images/ { 
    alias /data/w3/images/; 
} 

nó là tốt hơn để sử dụng các chỉ thị gốc thay vì:

location /images/ { 
    root /data/w3; 
} 

root chỉ thị sẽ nối thêm $uri vào đường dẫn.

+0

Tại sao nó tốt hơn? Tài liệu cũng không nói. – Heliodor

+0

Lợi ích mà tôi thấy là để tránh trùng lặp $ uri,/hình ảnh trong ví dụ cụ thể, khi sử dụng bí danh – antonbormotov

42

như nói như @treecoder

Trong trường hợp chỉ thị root, đường dẫn đầy đủ được gắn vào thư mục gốc trong đó có một phần địa điểm, trong khi trong trường hợp chỉ thị alias, chỉ có phần của con đường KHÔNG bao gồm phần vị trí được thêm vào bí danh.

Một bức tranh trị giá một ngàn chữ

cho root:

enter image description here

cho alias:

enter image description here

+2

Nếu mũi tên đầu tiên trong hình ảnh thứ hai có phải là dấu "+" không? – aioobe

0
server { 
    server_name xyz.com; 
    root /home/ubuntu/project_folder/; 

    client_max_body_size 10M; 
    access_log /var/log/nginx/project.access.log; 
    error_log /var/log/nginx/project.error.log; 

    location /static { 
     index index.html; 
    } 

    location /media { 
     alias /home/ubuntu/project/media/; 
    } 
} 

Chặn máy chủ để chạy trang tĩnh trên nginx.