2012-04-05 38 views
23

Tôi không thể tìm thấy một mod_go để triển khai các ứng dụng web Go. Có cách nào khác để chạy các ứng dụng web trong Go với máy chủ web Apache (hoặc thậm chí IIS) không?Triển khai các ứng dụng web Go với Apache

Cập nhật: Bây giờ sau khi làm Go toàn thời gian trong gần một năm; làm điều này (đi với Apache) là vô hiệu hóa mục đích rất của Go (Hiệu suất về mặt đồng thời). Và tôi đang sử dụng nginx như một proxy ngược cho http/https và có phụ trợ Go của tôi đằng sau nó độc đáo. Mặc dù bạn phải thay đổi suy nghĩ của bạn trên webapps một chút khi sử dụng Go.

+0

Những người quan tâm trong việc này cũng có thể thấy [một câu hỏi tương tự] (http://stackoverflow.com/q/17440415/165293). – Mostafa

Trả lời

22

Không có mod_go. (Ít nhất tôi không nghe nói về một điều như vậy.)

Một ứng dụng web đi một mình là một máy chủ web có khả năng. Bạn có thể nghe cổng 80 trong ứng dụng của bạn và sau đó trực tiếp chạy nó trên máy chủ của bạn. Tin tôi đi: nó thực sự hoạt động! Tuy nhiên, nếu bạn không làm điều đó (vì những lý do như có các máy chủ ảo khác trên cùng một máy, cân bằng tải, vv), bạn có thể sử dụng máy chủ HTTP như nginx hoặc Apache làm proxy HTTP ở phía trước của ứng dụng Go của bạn. Tôi sử dụng nginx và nó rất tuyệt. Here's an outdated but still very useful hướng dẫn về cách làm điều đó với nginx. Tôi đã không làm điều đó với Apache, nhưng this sẽ giúp đỡ.

Tôi tự giới thiệu ứng dụng web Go của bạn hoặc nginx làm proxy HTTP.

+0

Tôi tìm thấy mod_go này trên một repo github, nó có thể là thú vị để kiểm tra: https://github.com/idaunis/mod_go –

8

Trong khi không lý tưởng, bạn có thể chạy các chương trình Go dưới dạng tập lệnh CGI bằng cách đặt chúng trong thư mục cgi-bin. Bạn có thể gọi họ như bất kỳ trang nào khác thông qua server.com/cgi-bin/myapp?foo=bar

Một chương trình ví dụ sẽ trông như thế này:

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/cgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    cgi.Serve(nil) 
} 

Lý do này không phải là tối ưu như chạy các chương trình như máy chủ của riêng mình, là với một cgi cách tiếp cận, chương trình được gọi cho mỗi yêu cầu duy nhất. Vì vậy, bất kỳ trạng thái bên trong nó không tồn tại.

Để rõ ràng: Bạn nên đặt nhị phân đã biên dịch vào thư mục cgi-bin. Không phải là nguồn chương trình.

22

Ngoài các tùy chọn khác, cũng có gói net/http/fcgi. Điều này tương tự như tùy chọn CGI, nhưng nó sử dụng FastCGI và ứng dụng của bạn có thể giữ trạng thái nếu nó cần.

Đây là phiên bản FastCGI của ví dụ về jimt. Lưu ý rằng chỉ có hai dòng là khác nhau. Tùy thuộc vào cách bạn cấu hình Apache, bạn có thể phải thay đổi đối số đầu tiên thành một cái gì đó khác, nhưng nil là trường hợp phổ biến.

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/fcgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    fcgi.Serve(nil, nil) 
} 
+0

Bạn có biết bất kỳ ví dụ sử dụng net/http/fcgi? – BurntSushi5

+0

@ BurntSushi5 Đã chỉnh sửa để thêm ví dụ –

+0

Có một giới hạn ở đây, tuy nhiên, điều này có thể rất quan trọng đối với một người nào đó. Trích dẫn tài liệu gói: "Hiện tại chỉ hỗ trợ vai trò phản hồi". Điều này có nghĩa là không thể xử lý http auth bằng mã Go của bạn theo cách này. – abbot

2

Tôi chỉ sử dụng cơ sở proxy của máy chủ web và chạy ứng dụng của tôi như một daemon thông thường (sử dụng daemonize) trên máy chủ. Trên apache sẽ là ProxyPass + ProxyPreserveHost.

+0

bạn có ví dụ nào không? – slier

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