2013-10-04 14 views
5

Tôi đang cố gắng tìm cách liên kết máy chủ Rails sản xuất của mình với cổng 80 mà không phải chạy toàn bộ máy chủ với các đặc quyền root. Câu hỏi của tôi về cơ bản giống như "Is there a way for non-root processes to bind to "privileged" ports (<1024) on Linux?", ngoại trừ việc tôi cần phải làm điều này với Rails. Hiện tại, hai câu trả lời hàng đầu về câu hỏi mà tôi đã tham chiếu hoặc yêu cầu tôi cấp quyền CAP_NET_BIND_SERVICE cho trình thông dịch Ruby (có thể không phải là một ý tưởng tốt) hoặc thả đặc quyền root sau khi khởi động máy chủ (I'm not sure is possible with Ruby). Bất kỳ ý tưởng?Ràng buộc một máy chủ Rails vào cổng 80 trên Linux mà không cần chạy nó như là root

+1

Bạn có tùy chọn chạy máy chủ web truyền thống trên cổng 80 và chuyển tiếp các yêu cầu đến máy chủ Rails đang chạy trên cổng khác không? Ví dụ: chạy [nginx] (http://wiki.nginx.org/Main) và gửi yêu cầu đến [thin] (http://code.macournoyer.com/thin/) hoặc [unicorn] (http: // unicorn.bogomips.org/) chạy trên một cổng không có đặc quyền. –

+0

Các tỷ lệ cược bạn thực sự muốn làm điều này là cực kỳ thấp. Thin, Mongrel, Puma, Unicorn, hoặc bất cứ thứ gì khác nên ở phía sau một máy chủ không phải Ruby trong các mẫu sử dụng bình thường. Xem [câu hỏi này] (http://stackoverflow.com/questions/15469598/why-thin-behind-nginx). – colinm

+0

Vâng, đây là lần đầu tiên tôi thực sự cố gắng triển khai một ứng dụng sản xuất mà không cần sự giúp đỡ của người khác để thiết lập máy chủ cho tôi, hoặc một PaaS như Heroku; vì vậy có một cơ hội tốt mà tôi không biết tôi muốn. Nếu bạn muốn đăng câu trả lời chi tiết cho thấy một giải pháp thay thế để gắn kết mỏng trên cổng 80 (như nginx, như Jim đã nói trong bình luận của mình), tôi chấp nhận đó là câu trả lời hợp lệ. – Ajedi32

Trả lời

4

Vì vậy, về cơ bản, câu trả lời là bạn không. Có thể có một số cách thực sự khó khăn để thực hiện công việc này, nhưng tỷ lệ cược mà bạn thực sự muốn làm điều này là cực kỳ thấp. Thay vào đó, hãy chạy Rails trên một cổng không có đặc quyền và thiết lập một máy chủ web thực sự như nginx để chuyển tiếp tới Rails.

Như một ví dụ siêu đơn giản, với nginx bạn có thể sử dụng một tập tin cấu hình mà trông giống như sau:

upstream rails_server { 
    server localhost:3000; 
} 

server { 
    listen 80; 

    location/{ 
    root /home/deploy_user/rails_app/public; 
    try_files $uri @missing; 
    } 

    location @missing { 
    proxy_pass http://rails_server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    } 
} 

Giải pháp này cũng là tốt hơn dài hạn, bởi vì nó làm cho cơ sở hạ tầng của bạn linh hoạt hơn. Ví dụ, nếu bạn cần mở rộng ứng dụng của bạn lên nhiều máy, bạn có thể sử dụng nginx như một bộ cân bằng tải và chuyển tiếp các yêu cầu tới một loạt các máy chủ Rails chạy trên các máy khác nhau.

Các vấn đề liên quan