Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Apache多个虚拟主机的Golang webapp_Apache_Go_Webdeploy_Virtual Hosts - Fatal编程技术网

带有Apache多个虚拟主机的Golang webapp

带有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 ":"

不幸的是,我无法在生产服务器上部署基本的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 ":"
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))