[nginx] 基于Docker安装Nginx
0 序
- 环境信息
OS
: CENTOS 7.9Docker
: 25.0.4Nginx
: 1.24.0
1 安装步骤
Step0 安装 docker
略。可参见:
Step1 下载nginx镜像
- 下载 nginx镜像
docker pull nginx:1.24.0
+ 查看下载的镜像
docker images
Step2 基于宿主机创建Nginx配置文件
- 创建挂载目录
启动前需要先创建Nginx外部挂载的配置文件(
/data/nginx/conf/nginx.conf
)
之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx
目录 , 本身就不创建nginx.conf
文件
当服务器和容器都不存在nginx.conf
文件时, 执行启动命令的时候 docker 会将nginx.conf
作为目录创建 , 这并不是我们想要的结果 。
mkdir -p /data/nginx/conf
mkdir -p /data/nginx/conf/conf.d
mkdir -p /data/nginx/html
mkdir -p /data/nginx/log
- 将样例容器中的nginx.conf文件和conf.d文件夹复制到宿主机
# 生成DEMO容器 (后面步骤中可删除之)
docker run --name demo-nginx -p 18080:80 -d nginx:1.24.0
# 将容器/etc/nginx下的文件
docker cp demo-nginx:/etc/nginx/ /data/nginx/conf/
### nginx.conf文件复制到宿主机
### [无需执行] docker cp demo-nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf
### 将容器conf.d文件夹下内容复制到宿主机
### [无需执行] docker cp demo-nginx:/etc/nginx/conf.d /data/nginx/conf/conf.d
### 将容器mime.types文件下内容复制到宿主机
### [无需执行] docker cp demo-nginx:/etc/nginx/mime.types /data/nginx/conf/mime.types
# 将容器中的html文件夹复制到宿主机
docker cp demo-nginx:/usr/share/nginx/html /data/nginx/html
# 将容器中的日志文件夹复制到宿主机
docker cp demo-nginx:/var/log/nginx /data/nginx/log
# 停止 DEMO Nginx 容器
docker stop demo-nginx
# 删除 DEMO Nginx 容器
docker rm -f demo-nginx
Step3 创建Nginx容器、并运行
- 创建、并启动 nginx 容器
docker run \
-p 80:80 \
-p 443:443 \
-p 81:81 \
--add-host host.docker.internal:host-gateway \
--name nginx \
-v /data/nginx/conf/:/etc/nginx/ \
-v /data/nginx/log:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
-d nginx:1.24.0
-p 80:80
: 第1个 80 端口:是指宿主机的映射端口 ; 第2个 80 端口:是指容器的被映射端口-p 81:81
: 暴露多个端口的Demo。-d
: 后台运行--add-host:host.docker.internal:host-gateway
: 【可选参数】 标志启用主机的默认名称host.docker.internal
。使用此标志启动容器以公开主机字符串。 `
--add-host
标志向容器的/etc/hosts
文件添加一个条目。上面显示的值将host.docker.internal
映射到容器的主机网关
,这与真实的 localhost 值相匹配。如果您愿意,可以用您的主机真实名称替换 host.docker.internal 。
此做法主要用于解决: 在 nginx 容器中访问/代理宿主机的Web服务:
upstream xxxx_api_server {
ip_hash;
# server 127.0.0.1:8770 weight=1;
# host.docker.internal : docker 中代指 宿主机本机的IP
server host.docker.internal:8770 weight=1;
# server {{apiserver_host}}:{{apiserver_port}} weight=1;
}
location /xxxx/api {
// ...
proxy_pass http://xxxx_official_site_api_server/xxxx/api;
// ...
}
docker logs nginx
docker ps -a
- nginx 容器的基本使用与管理
# 查看容器进程、查找nginx对应的容器ID
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
# 删除正在运行的nginx容器
docker rm -f nginx
# 查看 nginx 容器的 运行日志
docker logs nginx
# 进入 nginx 容器内部
docker exec -it nginx bash
> ...
# 在 nginx 容器内部执行shell命令
docker exec -it nginx sh -c "ls -la /var/log/nginx"
Step4 测验:访问宿主机
curl http://127.0.0.1:80
使用浏览器打开 http://127.0.0.1:80 看到如下页面即表示部署成功:
2 卸载步骤
- 停止运行容器
docker stop nginx
- 删除该容器
docker rm nginx
3 附件:nginx container启用http协议/ssl认证(福利)
# 上传 SSL 证书
# mkdir -p /data/nginx/conf/cert
# unzip /www/packages/xxxx-web/12788873_xxxx.com.cn_nginx.zip -d /data/nginx/conf/cert/
# // /data/nginx/conf/cert/xxxx.com.cn.pem
# // /data/nginx/conf/cert/xxxx.com.cn.key
# 将 http/80 端口的所有流量重定向至 https/443 端口
vi /data/nginx/conf/conf.d/default.conf
# [x] 1. 修改默认监听的 80 端口 为 81 端口
# 2. 注释如下代码片段:
# location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
#}
# 3. 更新如下配置项:
#server_name localhost;
server_name xxxx.com.cn;
# 4. 新增如下配置项:
# Redirect all HTTP traffic to HTTPS
return 301 https://$server_name$request_uri;
touch /data/nginx/conf/conf.d/xxxx.com.cn.conf
vi /data/nginx/conf/conf.d/xxxx.com.cn.conf
编辑内容如下:
server {
listen 443 ssl;
# listen 80;
server_name localhost;
# ssl_certificate /data/nginx/conf/cert/xxxx.com.cn.pem;
# ssl_certificate_key /data/nginx/conf/cert/xxxx.com.cn.key;
ssl_certificate /etc/nginx/cert/xxxx.com.cn.pem;
ssl_certificate_key /etc/nginx/cert/xxxx.com.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
# root /www/nginx/html/yyyy-web/;
root /usr/share/nginx/html;
# root /www/wwwroot/love_connect/;
# index index.html index.htm;
}
# 引入相关配置
# include /data/nginx/conf/conf.d/xxxx.com.cn.locations/*.conf;
include /etc/nginx/conf.d/xxxx.com.cn.locations/*.conf;
}
upstream yyyy_official_site_api_server {
ip_hash;
# server 127.0.0.1:8770 weight=1;
# host.docker.internal : docker 中代指 宿主机本机的IP
server host.docker.internal:8770 weight=1;
# server {{apiserver_host}}:{{apiserver_port}} weight=1;
}
mkdir -p /data/nginx/conf/conf.d/xxxx.com.cn.locations/
touch /data/nginx/conf/conf.d/xxxx.com.cn.locations/
vi /data/nginx/conf/conf.d/xxxx.com.cn.locations/yyyy-official-site-api.conf
编辑内容如下:
#PROXY-START/
location /yyyy/api {
proxy_pass http://yyyy_official_site_api_server/yyyy/api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
set $static_fileymjeWjlG 0;
if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
{
set $static_fileymjeWjlG 1;
expires 1m;
}
if ( $static_fileymjeWjlG = 0 )
{
add_header Cache-Control no-cache;
}
}
#PROXY-END/
docker stop nginx
docker rm nginx
docker run \
-p 80:80 \
-p 443:443 \
--add-host host.docker.internal:host-gateway \
--name nginx \
-v /data/nginx/conf/:/etc/nginx/ \
-v /data/nginx/log:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
-d nginx:1.24.0
# docker start nginx
docker ps
docker logs -f --tail 20 nginx
4 附件:利用/rootHtml/index.html重定向至目标路径(福利)
/data/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>xxxx</title>
<style>
html { color-scheme: light dark; }
</style>
</head>
<body>
</body>
<script type="text/javascript" charset="utf-8" >
window.location.href = "https://xxxx.com.cn/xxxx";
</script>
</html>
X 参考文献
- docker
- 历往教程
- 其他
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!