通过Docker部署Nginx

本文主要介绍如何在在CentOS上部署通过podman部署nginx

一,系统说明

基于CentOS 8和podman

二,部署

2.1 下载镜像

podman pull nginx:latest
podman images -a
1
2
REPOSITORY                                TAG            IMAGE ID       CREATED        SIZE
docker.io/library/nginx latest 4bb46517cac3 2 days ago 137 MB

2.2 启动

podman volume create vo-nginx
podman run -d -it -e TZ=Asia/Shanghai -p 9999:80 -p 9998:443 -e TZ=Asia/Shanghai --name=nginx_devops -v vo-nginx:/etc/nginx/conf.d --restart=always docker.io/library/nginx
podman ps -a
1
2
CONTAINER ID  IMAGE                                        COMMAND               CREATED         STATUS            PORTS                     NAMES
b28544ec1f5a docker.io/library/nginx:latest nginx -g daemon o... 4 seconds ago Up 3 seconds ago 0.0.0.0:9999->80/tcp,0.0.0.0:9998->443/tcp nginx_devops
#进入镜像处理
podman exec -it b28544ec1f5a bash
cd /etc/nginx/

2.3 注意

  1. 你需要注意,由于是通过容器部署,所以你不能再在nginx的config里配置127.0.0.1,你需要输入宿主机的ip
  2. 关于ipv6的支持,你需要针对监听的端口写两次,如下。
1
2
listen [::]:80;
listen 80;

原因是nginx某个版本之后,如果你添加了ipv6的标示[::]:,nginx的ipv6only开关默认是on,就导致只监听ipv6来的数据。

3 其他实践

3.1 防火墙

linux下的各类防火墙SELinux、iptables端口策略、firewall-cmd
如果你不能关闭SELinux,请打开80端口:

1
setsebool -P httpd_can_network_connect 1

iptables

1
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

firewall-cmd

1
2
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

3.2 http2

你可能会遇到一切配置都是对的,但是就是不能转发,此时你可以尝试去除http2,注意,是把所有conf的http2都删除,漏删一个都不会有效。

1
2
3
4
5
6
server{
listen 80 http2;
server_name localhost;
rewrite ^ https://$host$request_uri? permanent;
}

3.3 http转发https

1
rewrite ^ https://$host$request_uri? permanent;