我正在努力处理静态文件,因为我对docker还不熟悉,流利对于 Apache,我不确定问题出在前者还是后者。
[设置] 我有一个带有 WSGI 服务器的 dockerized 应用程序,并且我使用非 dockerized Apache 作为代理通道。代理可以工作,但由于 WSGI 服务器无法提供静态文件,因此必须由 Apache 来执行此操作。以下是配置:
<VirtualHost *:80>
ServerName my.domain.name
ProxyPass /staticfiles !
<Location />
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</Location>
Alias /staticfiles "/var/lib/docker/volumes/app_static_volume/_data/"
<Directory "/var/lib/docker/volumes/app_static_volume/_data">
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
尽管我尝试了所有的指令Directory
,但我仍然得到403 错误. 日志提到了权限问题。
[Mon May 06 17:06:27.531541 2019] [core:error] [pid 73031:tid 139870919952128] (13)Permission denied: [client 127.0.0.1:55892] AH00035: access to /staticfiles/jengu/jquery.datetimepicker.full.min.js denied (filesystem path '/var/lib/docker/volumes/app_static_volume') because search permissions are missing on a component of the path, referer: http://my.domain.name/
这是有道理的:
ls -la /var/lib/docker/volumes/app_static_volume/_data
total 16
drwxr-xr-x 4 root root 4096 mai 6 14:33 .
drwxr-xr-x 3 root root 4096 mai 6 14:33 ..
drwxr-xr-x 6 root root 4096 mai 6 14:33 admin
drwxr-xr-x 3 root root 4096 mai 6 14:33 app
ls -la /var/lib/docker
total 84
drwx--x--x 15 root root 4096 mai 6 10:19 .
drwxr-xr-x 60 root root 4096 janv. 9 19:43 ..
drwx------ 2 root root 4096 août 13 2018 builder
.........
drwx------ 6 root root 4096 mai 6 14:33 volumes
#docker-compose
version: '3.7'
services:
web:
build:
context: ./app
dockerfile: Dockerfile.prod
command: gunicorn my_app.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/usr/src/app/staticfiles
ports:
- 127.0.0.1:8000:8000
env_file: .env
depends_on:
- db
db:
image: postgres:11.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file: .env.db
volumes:
postgres_data:
static_volume:
[我尝试过]当然可以更改卷的安装路径(我尝试过了,只想说:)- ./web-app/application:/usr/src/jengu/staticfiles
,我可以将它指向某个地方,/home/myuser
但是,无论如何,在某一时刻,路径的一个组成部分将无法被搜索。
[Mon May 06 17:53:18.038814 2019] [core:error] [pid 78453:tid 140402917062400] (13)Permission denied: [client 127.0.0.1:34708] AH00035: access to /staticfiles/app/jquery.datetimepicker.full.min.js denied (filesystem path '/home/david/Documents') because search permissions are missing on a component of the path, referer: http://my.domain.name/
有没有一种优雅的解决方法,这样我就不必大规模更改系统上的权限?我是否正确理解了 docker 卷?我的问题是否仅与 docker 有关,还是我遗漏了 apache conf 文件中的某些内容?任何帮助都值得感激
[编辑] 我尝试使用符号链接来解决这个问题。
ln -s /var/lib/docker/volumes/app_static_volume/_data/ /var/www/html/app/staticfiles
似乎没有解决太多问题
[Tue May 07 00:55:05.192193 2019] [core:error] [pid 5345:tid 140310969526016] [client 127.0.0.1:40766] AH00037: Symbolic link not allowed or link target not accessible: /var/www/html/app/staticfiles, referer: http://my.domain.name/
答案1
我能找到的最简单的方法是将卷安装在 PATH 的所有组件都允许搜索的位置(例如/usr/local/share/
)。这是docker compose
文件
version: '3.7'
services:
web:
build:
context: ./app
dockerfile: Dockerfile.prod
command: gunicorn my_app.wsgi:application --bind 0.0.0.0:8000
volumes:
- /usr/local/share/app/staticfiles:/usr/src/app/staticfiles
ports:
- 127.0.0.1:8000:8000
env_file: .env
depends_on:
- db
db:
image: postgres:11.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file: .env.db
volumes:
postgres_data:
static_volume: