Thay đổi ứng dụng Rails sang sản xuất


190

Làm cách nào để thay đổi ứng dụng Rails của tôi để chạy trong chế độ sản xuất? Có một tập tin cấu hình, môi trường.rb chẳng hạn, để làm điều đó?


2
Có vẻ như câu trả lời thứ hai có nhiều phiếu hơn, bạn có sẵn lòng đưa ra đánh giá nhanh này và chấp nhận câu trả lời thứ hai trừ khi bạn có bất kỳ vấn đề nào với nó. Sẽ chỉ giúp du khách trong tương lai. Thx :)
Tiến hóa

Câu trả lời:


73

Cách thiết lập và chạy ứng dụng Rails 4 trong chế độ Sản xuất (từng bước) bằng cách sử dụng Hành khách của Apache và Phusion:

Thông thường, bạn sẽ có thể tham gia vào dự án Rails của mình rails svà nhận phiên bản phát triển của ứng dụng tại http://s Something.com:3000 . Chế độ sản xuất là một chút phức tạp hơn để cấu hình.

Tôi đã loay hoay với điều này trong một thời gian, vì vậy tôi nghĩ rằng tôi sẽ viết nó cho những người mới (chẳng hạn như bản thân tôi). Có một vài điều chỉnh nhỏ được lan truyền trên internet và cho rằng điều này có thể dễ dàng hơn.

  1. Tham khảo hướng dẫn này để thiết lập lõi của máy chủ (CentOS 6, nhưng nó nên áp dụng cho gần như tất cả các hương vị Linux): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-with-apache-and-hành khách-trên-centos-6

  2. Đảm bảo tuyệt đối rằng sau khi Hành khách được thiết lập, bạn đã chỉnh sửa /etc/httpd/conf/httpd.conftệp để phản ánh cấu trúc thư mục của mình. Bạn muốn trỏ DocumentRoot vào thư mục dự án / thư mục công cộng Rails của bạn Bất cứ nơi nào trong httpd.conftệp có loại thư mục này: /var/www/html/your_application/publiccần phải được cập nhật hoặc mọi thứ sẽ trở nên rất bực bội. Tôi không thể nhấn mạnh điều này đủ.

  3. Khởi động lại máy chủ (hoặc ít nhất là Apache service httpd restart)

  4. Nhập thư mục dự án Rails của bạn /var/www/html/your_applicationvà bắt đầu di chuyển với rake db:migrate. Đảm bảo rằng bảng cơ sở dữ liệu tồn tại, ngay cả khi bạn dự định thêm bảng sau (đây cũng là một phần của bước 1).

  5. RAILS_ENV=production rake secret- điều này sẽ tạo ra một secret_key mà bạn có thể thêm vào config/secrets.yml. Bạn có thể sao chép / dán phần này vào config / secret.yml để mọi thứ được chạy, mặc dù tôi khuyên bạn không nên làm điều này. Cá nhân, tôi làm bước này để đảm bảo mọi thứ khác đang hoạt động, sau đó thay đổi lại và lấy nguồn sau.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompilenếu bạn đang phục vụ tài sản tĩnh. Điều này sẽ đẩy các tập tin js, css, hình ảnh vào /publicthư mục.

  8. RAILS_ENV=production rails s

Tại thời điểm này, ứng dụng của bạn sẽ có sẵn http://something.com/whateverthay vì :3000. Nếu không, passenger-memory-statsvà xem nếu có một mục như908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Có lẽ tôi đã bỏ lỡ điều gì đó ghê tởm, nhưng điều này đã làm việc cho tôi trong quá khứ.


2
Tôi cảm thấy câu trả lời này nên được chuyển sang tài liệu stackoverflow.
Whitecat

Tôi sẽ nói thêm rằng nếu bạn không muốn sử dụng phân phối nội dung web như apache, bạn có thể thêm RAILS_SERVE_STATIC_FILES = 1 bên cạnh RAILS_ENV = sản xuất, điều đó có nghĩa là đường ray sẽ phục vụ mọi tệp vì vậy sẽ không đề xuất điều này cho trạng thái sản xuất thực tế ...
3d0

351

Bây giờ sẽ là

rails server -e production

Hoặc, nhỏ gọn hơn

rails s -e production

Nó hoạt động cho các dự án đường ray 3+.


33
hoặc phiên bản ngắnrails s -e production
Pavel Nikolov

2
Còn dịch vụ đám mây như Heroku thì sao? Làm thế nào để chạy server -e productiontrên chúng?
Màu xanh lá cây

Các dịch vụ đám mây thường có các tùy chọn để chỉ định môi trường, nhưng trong đó productionluôn là mặc định.
James Billingham

2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi

Câu trả lời được ưu tiên nhiều, câu trả lời này sẽ được đưa vào tài liệu StackOverflow.
dmanexe

61

Nếu bạn đang chạy trên Hành khách , thì mặc định là chạy trong sản xuất, trong apache conf của bạn:

<VirtualHost *:80>
  ServerName application_name.rails.local
  DocumentRoot "/Users/rails/application_name/public"
  RailsEnv production ## This is the default
</VirtualHost>

Nếu bạn chỉ đang chạy một máy chủ cục bộ với mongrel hoặc webrick, bạn có thể làm:

./script/server -e production

hoặc trong bash:

RAILS_ENV=production ./script/server

thực sự ghi đè hằng số RAILS_ENV trong enviornment.rb có lẽ nên là phương án cuối cùng của bạn, vì có lẽ nó sẽ không được giữ nguyên (xem một câu trả lời khác tôi đã đưa ra về điều đó)


54

Nếu đề xuất của mipadi không hoạt động, hãy thêm nó vào config / môi trường.rb

# force Rails into production mode when                          
# you don't control web/app server and can't set it the proper way                  
ENV['RAILS_ENV'] ||= 'production'

Còn dịch vụ đám mây như Heroku thì sao? Có ENV['RAILS_ENV'] ||= 'production'thể được áp dụng trên chúng quá?
Green

Tôi đã chỉnh sửa tập tin này từ lâu và quên .. cảm ơn vì đã nhắc nhở .. đã tiết kiệm rất nhiều thời gian
Agnes

19

Thay đổi biến môi trường RAILS_ENVthành production.


3
biến môi trường nằm ở đâu?
BKSpurgeon

có thể được đặt tại ~/.bashrchoặc ~/.bash_profileđơn giảnexport RAILS_ENV=production"
Shimaa Marzouk


18

Bạn cũng có thể chuyển môi trường cho tập lệnh / máy chủ:

$ script/server -e production

12
rails s -e production

Điều này sẽ chạy máy chủ với RAILS_ENV= 'production'.

Ngoài ra, bạn phải đặt đường dẫn tài sản trong production.rb

config.serve_static_assets = true

Không có điều này, tài sản của bạn sẽ không được tải.


Xin lỗi ... đã bỏ phiếu xuống khi có ý định nâng cấp. Thực hiện chỉnh sửa nhẹ để sửa lỗi và upvote.
tomd

7
RAILS_ENV=production rails s

HOẶC LÀ

rails s -e production

Theo mặc định môi trường là phát triển.


5

Như những người khác đã đăng: rails server -e production

Hoặc, fave cá nhân của tôi: RAILS_ENV=production rails s


2

Trong Rails 3

Thêm Rails.env = ActiveSupport::StringInquirer.new('production')vào application.rb và rails ssẽ hoạt động giống nhưrails server -e production

module BlacklistAdmin
  class Application < Rails::Application

    config.encoding = "utf-8"
    Rails.env = ActiveSupport::StringInquirer.new('production')

    config.filter_parameters += [:password]
  end
end

2

Nó không phải là một cách tốt để chạy máy chủ rails trong môi trường sản xuất bởi "rails server -e sản xuất", bởi vì sau đó rails chạy như một ứng dụng đơn luồng và chỉ có thể đáp ứng một yêu cầu HTTP tại một thời điểm.

Bài viết hay nhất về môi trường sản xuất cho đường ray là Môi trường sản xuất - Đường ray 3


3
Liên kết thối ... có sẵn trên máy
wayback

1

cho máy chủ mặc định: rails s -e sản xuất

đối với cổng máy chủ costum: rails s -p [port] -e sản xuất, vd. ray s -p 3002 -e sản xuất


1

Theo mặc định, máy chủ chạy trên môi trường phát triển: $ rails s

Nếu bạn đang chạy trên môi trường sản xuất: $ rails s -e productionhoặc$ RAILS_ENV=production rails s


0

Vui lòng đảm bảo rằng bạn đã thực hiện bên dưới trong tệp môi trường của bạn.

ENV ['RAILS_ENV'] || = 'sản xuất'

Nếu ứng dụng của bạn chạy trong môi trường lưu trữ được chia sẻ hoặc hành khách ph Muff, bạn có thể cần thực hiện các thay đổi trong .httaccess (bên trong thư mục công cộng) và đặt chế độ làm sản xuất.

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.