2012-01-11 39 views
8

Tôi đã đọc từng chuỗi triển khai Haskell mà tôi có thể tìm thấy ở đây và một số trên web rộng hơn, nhưng tôi vẫn không nhận được một thứ. Nếu tôi đã biên soạn một ứng dụng cho máy chủ của tôi, và có thể ssh in và chạy nó, làm thế nào để tôi đi về việc chạy điều? Giả sử tôi đang sử dụng giao diện HTTP (không phải FastCGI). Ví dụ, với node.js, chúng tôi sử dụng cluster để bắt đầu ứng dụng trên một số lõi bộ xử lý, sau đó tạo tập lệnh init.d cho centOS để có được thứ để chạy, daemonize, có tệp pid, v.v.Cách chạy ứng dụng web Haskell đã triển khai

Làm cách nào để thực hiện điều này cho ứng dụng Haskell?

+1

Bạn đang sử dụng một khuôn khổ cụ thể? (Happstack/Yesod/etc?) – alternative

+0

Có. :) Tôi quan tâm đến cả Happstack và Snap. Tôi đã chơi với Hack2, nhưng nó sử dụng máy chủ của Snap. –

Trả lời

6

Vì bạn không đề cập đến khung nào bạn đang sử dụng, tôi sẽ chỉ trả lời câu hỏi này nói chung.

Với Haskell, bạn không phải bắt đầu nhiều phiên bản (trong một cụm) của ứng dụng web, bởi vì nếu ứng dụng hỗ trợ đồng thời, nó thường sử dụng nhiều luồng nội bộ. Thay vào đó, những gì bạn muốn làm là đảm bảo rằng ứng dụng được biên dịch với các cờ -threaded-rtsopts. Sau đó, khi bạn chạy ứng dụng, bạn vượt qua các cờ +RTS -N<number of simultaneous threads>. Nếu bạn sử dụng ứng dụng web Snap chạy trên cổng 1234 trên máy tính 8 lõi với Intel® Hyper-Threading, ví dụ, bạn sẽ bắt đầu nó với my-server -p 1234 +RTS -N16 để làm cho nó tương đương với tối đa 16 chuỗi hệ điều hành.

Để daemonize ứng dụng web, bạn sử dụng quy trình tương tự như với node.js. Bạn tạo một init script để bắt đầu thực thi trong các chế độ chạy UNIX khác nhau, và Bob là chú của bạn.

Giống như bất kỳ ứng dụng web nào khác, bạn có thể muốn sử dụng máy chủ kết thúc chuyển hướng lưu lượng truy cập đến ứng dụng web của bạn (đó là lý do tại sao bạn không muốn sử dụng cổng 80 cho các ứng dụng web của mình). Để biết chi tiết về cách thực hiện việc này, hãy truy cập the Web/Deploy page on HaskellWiki.

+0

Bạn đã trả lời chính xác câu hỏi mà tôi đang cố gắng tìm ra! Nhưng làm thế nào để bạn chạy ứng dụng snap trên máy chủ của bạn nếu bạn không muốn sử dụng một máy chủ kết thúc trước (Tôi không biết tại sao tôi sẽ cần nó)? Đơn giản là, nói dịch vụ Ubuntu, chạy "your_app_name -p 80 + RS -N16" ??? Tôi hy vọng bạn trả lời, tôi đã cố gắng tìm ra điều này trong một thời gian ... Cảm ơn! – drozzy

2

Ba khung lớn web Haskell (Snap, Yesod và Happstack) đều có khả năng gửi kèm máy chủ web được tích hợp sẵn. Phương pháp tiếp cận truyền thống để triển khai sản xuất có thể sử dụng cơ chế hệ điều hành của bạn daemon trong init script hoặc tương tự. Một giải pháp nhẹ hơn tôi đã sử dụng là một đoạn mã giống như sau:

while true; do 
    echo Restarting at `date` | tee -a stdout.log stderr.log > /dev/null 
    ./my_app 80 >> stdout.log 2>> stderr.log 
done 

Tôi chạy tập lệnh này ở chế độ nền. Nó chết đơn giản, vì vậy quá trình shell script không bao giờ bị treo. Nếu máy chủ bị treo vì bất kỳ lý do nào, tập lệnh này sẽ tự động đảm bảo rằng máy chủ đó được khởi động lại ngay lập tức. Nếu bạn muốn tung ra một phiên bản mới, chỉ cần sao chép nó qua tệp thực thi my_app và gửi một SIGHUP đến quá trình my_app.

Sysadmins cứng ngoài đó có thể rùng mình như thế này. Tôi sẽ không nói đây là cách tốt nhất để làm điều đó, nhưng tôi đã chạy một ứng dụng sản xuất trong nhiều năm với cách tiếp cận này và nó đã làm việc rất tốt. Như những người khác đã đề cập, bạn cũng có thể thiết lập điều này với một máy chủ proxy mặt trước để ứng dụng của bạn không phải chạy dưới dạng root.

+0

Cách tiếp cận này làm cho nó khó khăn để làm công cụ mà nhiều sysadmins muốn làm với daemon của họ, như kiểm tra tình trạng quá trình (mà không thể được thực hiện với 'ps aux | grep ...'hoặc' pgrep' khi bạn có nhiều daemon với cùng tên/giống nhau), hãy thực hiện tải lại cấu hình thực tế mà không có các tín hiệu đặc biệt, v.v. – dflemstr

+0

Tất nhiên. Đó là một giải pháp nhẹ hơn đã làm việc tốt cho tôi trong những tình huống mà cách tiếp cận mà một sysadmin nghề nghiệp có thể mất một chút về phía nặng nề. – mightybyte

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