我有一些网络项目(网站)运行它自己的网络服务器(在我的情况下,我使用 Haskell 的 snap 服务器 - 但这对于这个问题的目的无关)。
如何让它在系统的 80 端口上运行,以便向公众提供其内容?我特别感兴趣的是:
- 我应该把它放在系统的哪里??
/var/blah
Linux 中是否有一个标准位置? - 服务应以哪个用户和/或组的身份运行?我知道要在 80 上运行,您必须是 root。
- 该文件夹(在步骤 1 中)需要具有什么样的权限/所有权?
- 如何自动启动我的服务,并在退出 ssh 连接后保持其运行?(例如,在 Windows 中,可以使用以下命令完成此操作:执行程序)
任何帮助或指明正确方向的帮助都值得感激。谢谢!
PS:如果有帮助的话,我正在使用 Ubuntu 12.04 64位。
答案1
您可以将其放在任何地方。/usr/bin 是服务器的标准位置;/var/www 是站点内容或 CGI 的标准位置。
编写良好的服务将以 root 身份启动,绑定到端口 80,并将权限授予权限较低的用户或无人。这就是它使用特权端口的方式。如果它使用 SSL 证书,它也应该以 root 身份读取它们,然后放弃权限。因此,您应该以 root 身份启动它。
webroot(通常是 /var/www)需要为守护进程放弃权限的任何用户提供读取和执行权限。无论如何,对于您在网络上提供的内容而言,全球可读和全球可执行通常不是一个坏主意。
您可以使用 init 脚本自动启动它。有一个 C 调用 daemon()(至少在 GNU C 中),它会导致进程关闭其终端并忽略 hups,这意味着它将在您的 ssh 会话关闭并且 tty 消失后运行。如果不是这样写的,您可以在命令后加上一个与号 (&) 以使其在后台运行,并且它将在您的 shell 死机后继续运行。
答案2
我使用 Ubuntu 的 upstart 来完成它。
- 创建
/etc/init/mysite.conf
(以 root 身份) 添加服务(作业)描述:
chdir /home/john/webapps/mysite exec /home/john/webapps/mysite/bin/snap-app -p 80
检查是否正在运行,如果需要则手动启动:
initctl list | grep mysite initctl start mysite
请注意,这里我使用了 upstart 的chdir
指令来告诉它从该目录运行一个进程。这是必要的,因为该目录包含二进制文件(位于bin
文件夹中)所需的所有模板(html 等)。
该项目归用户所有john
,因此我认为这是可以的设置。
答案3
我也在 Ubuntu 12.04 上使用 snap 服务器,一个简单的,我不知道是否“更好”,解决方案可能是设置这样的 cron 作业。
sudo crontab -e
sudo
如果你确实想要在端口 80 上,那么添加此行
@reboot cd /home/path/yourapp; sudo /home/path/.cabal/bin/yourapp -p 80
Ctrl+x
并按yes
或y
保存它(它是 vi 编辑器),然后您可以重新启动并查看。实际的重新启动是启动实例。现在,如果您不停止它、更改 cron 作业或关闭计算机,它将在端口 80 上运行。
它可能也适用于项目的执行,但这已经过测试。
Upstart 版本也可以使用,但是比较简单。