2016-01-04 51 views
1

目前我的go服務器正在端口4000上運行。要訪問web應用程序,我需要在瀏覽器中輸入somedomainname:4000golang - 如何將數據從默認端口路由到另一個[4000]端口

我想只有鍵入somedomainname,它應該在端口的連接到網絡服務器4000

+2

讓你的圍棋服務器運行在端口80 – Volker

+0

@Volker,目前其在4000端口不是80,我想在端口4000上運行它,但需要某種類型的映射,如果我在瀏覽器上輸入域名就應該向端口4000發出請求 – GCP

+0

嘗試使用docker。您可以在端口4000上的Docker容器中運行服務器,並使容器顯示端口80 – elgris

回答

4

有幾種方案來解決這個:

  1. 讓你的圍棋服務器的端口直接聆聽但是,要小心你如何實現這一點。 請勿以根的身份運行您的服務,但應該使用Linux功能(感謝@JimB在評論中提醒我注意這一點)。您可以使用setcap授予過程的能力綁定到一個特權端口:

    > setcap 'cap_net_bind_service=+ep' /path/to/your/application 
    
  2. 使用HTTP反向代理Nginx的一樣,從端口80的HTTP請求轉發到您的Go應用程序。下面是Nginx的一個示例配置文件:

    upstream yourgoapplication { 
        server localhost:4000; 
    } 
    
    server { 
        listen 80; 
    
        server_name somedomainname; 
    
        location/{ 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Proto $scheme; 
    
        proxy_pass http://yourgoapplication; 
        } 
    } 
    

    當你做到這一點,您可以配置Go應用程序,聽取對127.0.0.1:4000而不是0.0.0.0:4000使您的應用程序訪問通過端口80

  3. 如果您在Docker容器中部署應用程序,則可以將容器端口4000簡單映射到主機端口80. See the manual以獲取更多信息。

+2

1不正確。您可以並且應該將您的服務器作爲非特權用戶運行,並且仍然使用linux功能綁定到80。使用setcap和CAP_NET_BIND_SERVICE。不要使用authbind,這是在linux能力有17年前編寫的,而這本身已經存在很多年了。 – JimB

+0

更不用說,authbind使用LD_PRELOAD來覆蓋對'bind'的調用,這對Go來說不起作用,因爲Go會直接調用系統調用。 – JimB

+0

@JimB,謝謝你的提示,我完全忘記了setcap。我已經更新了我的答案並刪除了對authbind的引用。 – helmbert

相關問題