问题1:root用户不能创建端口号为80的nginx应用程序吗?
Podman无法创建绑定到端口的容器<1024.
不允许非特权用户绑定到端口<1024,所以这需要root。
所以我只能在root下创建nginx?我还需要PHP和mariadb来支持我的网站,我已经尝试在nginx的配置文件中引用PHP:
location ~ .php(.*)$ {
fastcgi_pass php:9000;
...
}
使用nginx -t
进行检查并报告错误:nginx: [emerg] host not found in upstream "php" in ...
但docker是这样工作的
我该怎么办
docker守护进程以root权限运行,在系统级管理网络。它创建了额外的网络,其中docker容器有一个ip地址,并将主机连接到这些网络。
据我所知,无根podman进程也会创建这些网络,但无法将主机连接到这些内部podman网络,因为它没有足够的权限。
但无根的podman可以将集装箱的港口映射到港口>1024,因为这不需要root权限。
我的解决方法:
- 我将运行在无根podman容器中的web应用程序暴露给一个像8090这样的高端口
- 我设置了一个NGINX反向代理来代理从端口443到端口8090的传入流量
- 我配置ufw(任何防火墙都可以(来阻止从外部到端口8090的流量
这样,web应用程序可以在无根容器中运行,并且仍然可以在80或443等标准端口上访问。使用nginx作为反向代理,您甚至可以在中心点管理Let's Encrypt证书。
注意:在步骤1中,您必须在podman命令中指定一个端口映射。类似podman run -p 127.0.0.1:8090:80 image
的东西。
为了完整起见,我的nginx配置看起来像这样:
server {
server_name example.org;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
proxy_pass http://127.0.0.1:8090/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}