Làm thế nào để chạy rails s -p80 trên cổng 80?


87

Theo mặc định,

 rails s #running on 3000 port

Bây giờ tôi muốn chạy nó trên cổng 80. Vì vậy, tôi đã thử:

 sudo rails -s -p80

Nhưng nó đã xuất hiện một lỗi:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ sudo rails s -p80
sudo: rails: command not found

Tôi đã sử dụng rvm để cài đặt ruby ​​& rails. Có vẻ như rvm là do người dùng chỉ định. Nó không thể tìm thấy đường ray trong gốc?

Tôi cũng đã thử mã dưới đây:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ which rails
/home/mlzboy/.rvm/gems/ruby-1.9.2-p0/bin/rails
mlzboy@mlzboy-MacBook ~/my/b2c2 $ sudo /home/mlzboy/.rvm/gems/ruby-1.9.2-p0/bin/rails s -p80

Câu trả lời:


212
rvmsudo rails server -p 80

@pinouchon nó hoạt động vì rvmsudosudo cộng với tải rvm như sudo.
iain

2
Nếu giống như tôi, bạn đang sử dụng rbenv thay vì rvm, thì plugin rbenv này sẽ hoạt động tương tự: github.com/dcarley/rbenv-sudo
micapam

Điều này sẽ có nhiều rủi ro hơn nếu có một lỗ hổng bảo mật trong RVM, vì nó đang chạy dưới dạng root?
Kevin Chen

2
@Kevin Chen: Không phải trong RVM, nhưng tôi sẽ lo lắng về việc chạy Rails dưới dạng root. Trong quá trình sản xuất, bạn sẽ sử dụng Apache hoặc Nginx, cần quyền root để xác nhận cổng, nhưng chạy như một người dùng đặc biệt. Giải pháp của tôi chỉ là để thử nghiệm những thứ đang phát triển.
Iain

Tôi mệt mỏi vì điều này nhưng nhận được socket.rb:206:in ràng buộc ': Địa chỉ đã được sử dụng - bind (2) cho 0.0.0.0:80 (Errno :: EADDRINUSE) `error
r15

23

Chỉ cần chuyển tiếp yêu cầu từ cổng 80 đến cổng 3000 bằng lệnh dưới đây:

sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000

Một tùy chọn khác là:

rvmsudo rails server -p 80

Tuy nhiên, hãy nhớ giải phóng cổng này khỏi Apache hoặc các dịch vụ khác sử dụng cổng này bình thường. Ngoài ra, tôi không chắc việc cấp quyền sudo cho RVM có thể có bất kỳ vấn đề bảo mật nào hay không?


Điều này sẽ tiêu thụ hai cổng, và nó sẽ không cho phép để chạy một ví dụ ruby trên cổng 3000.
Konstantin

Làm thế nào để bạn đảo ngược điều này? Nó hoạt động hoàn hảo đối với tôi, điều này thật tuyệt, nhưng nếu tôi muốn hoàn tác chuyển hướng thì sao? Cảm ơn.
robins35

cần phải thiết lập lại bảng định tuyến IP mặc định
Dinesh Saini

1
Bạn có thể đảo ngược lệnh này bằng cách thay thế -Ibằng -D, vì vậy sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000. Câu trả lời ở đây sẽ đi vào chi tiết hơn: serverfault.com/questions/159544/undoing-port-osysteming .
bentrevor

8

Sẽ đề xuất

rails=`which rails` ; sudo $rails server -p 80

nhưng điều đó vẫn cố gắng sử dụng gemset toàn cầu chứ không phải gemset dự án từ RVM. Vì thế...

  1. Đảm bảo sshd đang chạy trên máy Mac của bạn. (Tùy chọn hệ thống => Chia sẻ => Đã chọn đăng nhập từ xa)
  2. Đảm bảo rails sđang chạy trên cổng 3000 với tư cách là người dùng không phải root của bạn
  3. Mở một thiết bị đầu cuối mới và ...

    me=``whoami``; sudo ssh -L 80:127.0.0.1:3000 -l $me -N localhost

(BTW giảm các `` trùng lặp '' thành số ít ở dòng trên, tôi không thể tìm ra cách thoát nó đúng cách ở đây.)

Đầu tiên Password:rootngười dùng của bạn , thứ hai là mật khẩu cho bất kỳ ai whoamitrả lại.

Mặc dù bạn có thể muốn cài đặt Phusion Passenger và thiết lập nó trong Apache cục bộ của bạn. Trừ khi bạn chỉ đang cố gắng demo một cái gì đó thực sự nhanh chóng và tất nhiên đây không phải là một giải pháp lâu dài.


chắc chắn rằng bạn sử dụng /usr/bin/which railstrong trường hợp đường ray là aliased
david_adler

1

Nếu bạn đang sử dụng RVM và bạn đã thiết lập mặc định, thì bạn không nên sử dụng sudo.

Chỉ:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ rails server -p 80

Tuy nhiên, 80 là một cổng đặc quyền, vì vậy bạn cần chạy dưới quyền root và bạn sẽ phải làm theo hướng dẫn cài đặt RVM cho nhiều người dùng .


root là bắt buộc đối với các cổng đặc quyền.
cfeduke

@cfeduke - Ôi! Bạn đúng.
Swanand

@marimaf - Tài liệu đã hoàn thiện theo thời gian. Đây là liên kết mới: rvm.io/rvm/install
Swanand

Cảm ơn bạn, điều này giúp truy cập máy ảo MAC từ máy chủ máy tính để kiểm tra ứng dụng rails mà tôi đang làm việc. Trong trường hợp đó, mặc dù tôi đã phải sử dụng tùy chọn -b (bind) với địa chỉ ip của vm.
Tom T

-1

bạn có thể khởi động máy chủ trên cổng 80

rails s -p 80

Nếu cổng 80 không liên kết (các quy trình khác không sử dụng cổng 80).


1
Cổng dưới 1024 cần quyền truy cập root và bạn không thể chạy ứng dụng cho đến khi bạn chưa thiết lập đường ray qua URL gốc. Tôi đã thực hiện và thử nghiệm nó.
Dinesh Saini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.