linux - Go、sudo 和 apache 端口 80

标签 linux apache go gorilla

我在 golang 中使用 gorilla/mux 包,但是有一些问题。首先是我没有权限在我的应用程序上使用端口 80,因为我无法从 sudo 运行应用程序,因为在使用 sudo 时未设置 $GOPATH

这是我从程序中得到的错误:

$ go run app.go 
2014/06/28 00:34:12 Listening...
2014/06/28 00:34:12 ListenAndServe: listen tcp :80: bind: permission denied
exit status 1

我不确定当我解决 sudo 问题时它是否还能工作,因为 apache 已经在使用端口 80,我不确定我的应用程序和 apache 是否可以一起“玩得很好”。

任何关于如何解决这个问题的建议都很好。谢谢。

最佳答案

引用elithar的评论,

You have two options: either turn off Apache (because only one service can bind to a port), or (better!) use Apache's ProxyPass to proxy any incoming requests to a specific Hostname to your Go server running on port (e.g.) 8000. The second method is very popular, robust, and you can use Apache to handle request logging and SSL for you.

反向代理

以这种方式在端口 80 上使用 Apache 称为反向代理。它接收端口 80(和/或 https 的端口 443)上的所有传入连接,并将它们传递给在您选择的任何端口上运行的 Go 程序,通常是未加密的,仅通过内部本地主机连接。经常使用 8000 和 8080。 Apache 和您的服务器之间的流量本身就是 HTTP 流量

因为您的 Go 程序不以 root 身份运行,所以它无法更改服务器上的关键功能。因此,如果您的程序包含安全漏洞,它会提供额外的安全性,因为任何攻击者都只能获得有限的访问权限。

快速CGI

通过不使用 HTTP 从 Apache 到 Go 服务器的连接,您可以提高反向代理的整体性能。这是通过 FastCGI protocol 完成的,最初是为 shell、Perl 和 PHP 脚本开发的,但也适用于 Go。要使用它,您必须修改您的 Go 服务器以使用 fcgi 进行监听。应用程序接口(interface)。 Apache FastCGI也是必需的。从 Apache 到您的服务器的流量使用更紧凑的格式(不是 HTTP),这减少了每一端的负载。

套接字类型的选择也是开放的:可以使用Unix sockets代替通常的TCP套接字。 ,这进一步降低了处理负荷。我自己没有在 Go 中这样做,但 API 支持 the necessary bits (参见 related question)。

Nginx

虽然上面所有描述的都是使用 Apache,但还有其他服务器产品也可以提供反向代理。最值得注意的是 Nginx ( Nginx reverse proxy example ),这将为您提供小而有用的性能和可扩展性优势。如果您的服务器上有此选项,那么值得学习和部署。

关于linux - Go、sudo 和 apache 端口 80,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462505/

相关文章:

php - 如何将 Symfony2.6 文件/文件夹权限/所有权恢复为默认值?

linux写系统调用和libc

linux - enqueue_wakeup宏linux的含义

asp.net - Mono vhost配置错误:地址已在使用中

php - Apache 使用旧的 PHP 版本

json - 将纪元时间戳解码为 time.Time

c++ - 调用父虚函数

java - Tomcat 8 迁移 - 如何获取响应 cookie

sql - Golang 上全局数据库连接和每次打开连接的性能差异

使用 Go 的 OpenStack 的 .htaccess 文件位置