带有Apache多个虚拟主机的Golang webapp
不幸的是,我无法在生产服务器上部署基本的Golang WebApp。在阅读了许多文档和教程之后,我明白了我需要作为守护进程运行Golang WebApp 首先:生产服务器是一个运行Ubuntu 16.04的单一IP,支持基于Apache的多个虚拟主机带有Apache多个虚拟主机的Golang webapp,apache,go,webdeploy,virtual-hosts,Apache,Go,Webdeploy,Virtual Hosts,不幸的是,我无法在生产服务器上部署基本的Golang WebApp。在阅读了许多文档和教程之后,我明白了我需要作为守护进程运行Golang WebApp 首先:生产服务器是一个运行Ubuntu 16.04的单一IP,支持基于Apache的多个虚拟主机/etc/apache2/sites/ 戈朗环境变量 # set golang environment vars export GOROOT=/usr/local/go # set multiple gopaths seperated by ":"
/etc/apache2/sites/
戈朗环境变量
# set golang environment vars
export GOROOT=/usr/local/go
# set multiple gopaths seperated by ":"
export GOPATH=/var/www/go_projects/gotest.domain2.com
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Systemd守护程序文件
[Unit]
Description=GoTest Webserver
[Service]
Type=simple
WorkingDirectory=/var/www/go_projects/gotest.domain2.com
ExecStart=/var/www/go_projects/gotest.domain2.com/main #binary file
[Install]
WantedBy=multi-user.target
虚拟主机配置
<VirtualHost *:80>
ServerName gotest.domain.com
DocumentRoot /var/www/go_projects/gotest.domain2.com
<Directory /var/www/go_projects/gotest.domain2.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
很遗憾,上的程序未执行。而是列出了DocumentRoot
手动运行返回
admin@xyz:/var/www/go_projects/gotest.domain2.com$ ./main
2018/02/18 15:52:58 listen tcp :8080: bind: address already in use
我遗漏了什么,或者我的部署方法主要是错误的?
干杯
编辑:
根据Michael Ernst的建议,我尝试更改端口/代理设置,结果如下:
http://gotest.domain2.com leads to 503 Service Unavailable
以下是sudonetstat-talpen的结果
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 16367 1250/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 473536 26340/master
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 0 16604 1417/dovecot
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 5001 17289 1652/asterisk
tcp 0 xx.xx.xx.xx:22 xx.xx.xx.xx:6126 ESTABLISHED 0 615988 13025/sshd: admin [
tcp6 0 0 :::22 :::* LISTEN 0 16369 1250/sshd
tcp6 0 0 :::25 :::* LISTEN 0 473537 26340/master
tcp6 0 0 :::3306 :::* LISTEN 111 17564 1391/mysqld
tcp6 0 0 :::143 :::* LISTEN 0 16605 1417/dovecot
tcp6 0 0 :::80 :::* LISTEN 0 612412 12554/apache2
tcp6 0 0 xx.xx.xx.xx:80 xx.xx.xx.xx:6128 FIN_WAIT2 0 0 -
tcp6 0 0 xx.xx.xx.xx:80 xx.xx.xx.xx:6129 ESTABLISHED 33 615029 12561/apache2
知道问题出在哪里吗?至于配置apache: 您需要启动go应用程序,并在apache配置中将请求反向代理到端口8080(您编写的go守护进程将侦听该端口)。 go应用程序需要始终运行,因此您可能希望在系统启动时启动它。与从apache调用的php不同,go应该作为始终存在的二进制文件运行 关于您的港口问题: 确保您的应用程序尚未启动,并且没有其他应用程序正在侦听端口8080。(您可以使用
netstat-talpen
查看)
编辑:
端口8080通常是http代理。是否有代理或其他应用程序在这一点上运行
编辑:
您可以这样配置apache:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName www.example.com
ServerAlias example.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
至于配置apache: 您需要启动go应用程序,并在apache配置中将请求反向代理到端口8080(您编写的go守护进程将侦听该端口)。 go应用程序需要始终运行,因此您可能希望在系统启动时启动它。与从apache调用的php不同,go应该作为始终存在的二进制文件运行 关于您的港口问题: 确保您的应用程序尚未启动,并且没有其他应用程序正在侦听端口8080。(您可以使用
netstat-talpen
查看)
编辑:
端口8080通常是http代理。是否有代理或其他应用程序在这一点上运行
编辑:
您可以这样配置apache:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName www.example.com
ServerAlias example.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
你为什么要用apache来托管Golang应用程序?大家好,有两个原因,1)服务器已经托管了几个PHP框架2)我只熟悉apache(PHP)。欢迎新的建议。你为什么要使用apache来托管Golang应用程序?干杯,有两个原因,1)服务器已经托管了几个PHP框架2)我只熟悉apache(PHP)。欢迎您的新建议。您可以给他2个ProxyPass/ProxyPassReverse行,以及一个更好的命令来识别端口8080上是否有任何内容正在侦听(例如netstat-talpen?@EugèneAdell感谢您的建议。我编辑了答案,将建议的更改合并到documentroot列表中,而不是执行,我想代理到应用程序服务器将同时解决它。Cheers Michael Ernst,Eugene Adell,不幸的是,我还没有成功。我已经编辑了我的帖子,并根据你的建议进行了更新。迈克尔(es funktioniert)谢谢!提出了您的建议之后,我所要做的就是重新启动守护进程。但是,像这样传递GET VAR会导致502代理错误
原因:DNS查找失败:localhost:8080test
知道原因是什么吗?您可以给他2行ProxyPass/ProxyPassReverse,以及一个更好的命令来识别端口8080上是否有任何内容正在侦听(例如netstat-talpen?)@欧热内德尔感谢你的建议。我编辑了答案,将建议的更改合并到documentroot列表中,而不是执行,我想代理到应用程序服务器将同时解决它。Cheers Michael Ernst,Eugene Adell,不幸的是,我还没有成功。我已经编辑了我的帖子,并根据你的建议进行了更新。迈克尔(es funktioniert)谢谢!提出了您的建议之后,我所要做的就是重新启动守护进程。但是,像这样传递GET Vars会导致502代理错误原因:localhost:8080test的DNS查找失败
知道原因是什么吗?
// define the flag
port := flags.Int("port", 8080, "port to listen on")
// parse the flags
flags.Parse();
// here you might want to add code to make sure the port is valid.
// start webserver
log.Fatal(http.ListenAndServe("localhost:"+strconv.Atoi(*port), nil))