我在 Ubuntu 上的 Docker 容器中运行lighttpd
(作为我的设置中必须始终启动的服务traefik
)。我的docker-compose.yml
容器包含:
lighttpd:
image: sebp/lighttpd
container_name: lighttpd
restart: unless-stopped
volumes:
- /srv/docker/traefik/lighttpd/etc/lighttpd.conf:/etc/lighttpd/lighttpd.conf
- /srv/docker/traefik/lighttpd/log/error.log:/var/log/lighttpd/error.log
- /srv/docker/traefik/lighttpd/log/access.log:/var/log/lighttpd/access.log
- /var/www/miniserver/html/:/var/www/html/
ports:
- "80"
tty: true
labels:
- "traefik.enable=true"
- "traefik.http.routers.lighttpd.rule=Host(`foo.rna.nl`)"
- "traefik.http.routers.lighttpd.entrypoints=web"
- "traefik.http.routers.lighttpd.tls=false"
networks:
- proxy
lighttpd
可以工作,对我有用index.html
,但是:
# docker logs lighttpd
2022-10-29 12:13:55: (server.c.1568) server started (lighttpd/1.4.64)
我收到了启动消息,但没有收到其他消息。当我将访问日志指向某个文件时,我收到了那里的访问日志条目:
172.26.0.2 foo.rna.nl - [29/Oct/2022:11:53:02 +0000] "GET /index.html HTTP/1.1" 200 37 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15"
如何将lighttpd
的访问日志直接发送到 stdout?我尝试了以下两种方法:
accesslog.filename = "/proc/self/fd/1"
accesslog.filename = "/dev/stdout"
我的完整lighttpd.conf
:
server.modules = (
"mod_indexfile",
"mod_access",
"mod_alias",
"mod_redirect",
"mod_accesslog",
)
server.document-root = "/var/www/html"
#server.errorlog = "/var/log/lighttpd/error.log"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain",
".jpg" => "image/jpeg",
".png" => "image/png"
)
accesslog.filename = "/proc/self/fd/1"
#accesslog.filename = "/dev/stdout"
#accesslog.filename = "/var/log/lighttpd/access.log"
答案1
看起来 Lighttpd 必须关闭标准输出当它启动时,所以你不能在那里发送输出,但是你能发送访问日志至标准错误:
accesslog.filename = "/dev/fd/2"
(或者/proc/self/fd/2
如果您愿意的话。)
如果你真的想登录标准输出代替标准错误,你可以执行一些 fd 重定向技巧,如下所示这里:
将新的 fd 重定向到原始 stdout:
#!/bin/sh exec 3>&1 lighttpd -D -f /etc/lighttpd/lighttpd.conf
将访问日志指向新的 fd:
accesslog.filename = "/dev/fd/3"
这需要用 shell 脚本覆盖现有的容器启动命令。