博客博客
  • 介绍
  • 链表反转
  • 排序算法
  • 二叉树

    • 介绍
    • 深度算法
  • 加密算法

    • 非对称加密
    • 摘要算法
    • 对称加密
  • 激活Windows 11
  • ASP.NET Core 健康检查
  • 获取程序集根目录
  • 闭包
  • CSS 单位指南:CSS em、rem、vh、vw 等详解
  • 自定义Code First约定
  • .NET安装本地化的智能提示
  • 免费开通域名企业邮箱
  • GRPC
  • Hexo生成github page
  • .Net Core日志管理之Log4net
  • linux下更新jenkins
  • MySQL的四种事务隔离级别
  • 发布NuGet包
  • rimraf命令
  • Ubuntu基础操作
  • Ubuntu安装jenkins
  • Vscode无法执行npm等脚本的问题
  • Json

    • Countries
  • 简介
  • 设计原则
  • 行为型模式

    • 介绍
    • 策略模式
  • 创建型模式

    • 介绍
    • 单例模式
  • 结构型模式

    • 介绍
  • Docker指南

    • 介绍
    • 安装
  • Docker实例

    • 介绍
    • docker安装consul
    • docker安装elasticsearch
    • docker安装gitlab-runner
    • docker安装gitlab
    • docker安装jenkins
    • docker安装kafka
    • docker安装mongo
    • docker安装mysql
    • docker安装nginx
    • docker安装portainer
    • docker安装rabbitmq
    • docker安装redis
    • docker安装teamcity
  • Docker教程

    • Docker命令大全
    • docker nginx添加端口映射
    • docker服务管理
  • Docker-Compose

    • 网络配置
    • service name和container name
  • 世界上的另一个我
  • 计划生育宣传标语
  • IT术语
  • Single is simple, double is trouble
  • 矿泉水、纯净水、天然水究竟有啥区别
  • 联系
  • 捐赠
GitHub
  • 介绍
  • 链表反转
  • 排序算法
  • 二叉树

    • 介绍
    • 深度算法
  • 加密算法

    • 非对称加密
    • 摘要算法
    • 对称加密
  • 激活Windows 11
  • ASP.NET Core 健康检查
  • 获取程序集根目录
  • 闭包
  • CSS 单位指南:CSS em、rem、vh、vw 等详解
  • 自定义Code First约定
  • .NET安装本地化的智能提示
  • 免费开通域名企业邮箱
  • GRPC
  • Hexo生成github page
  • .Net Core日志管理之Log4net
  • linux下更新jenkins
  • MySQL的四种事务隔离级别
  • 发布NuGet包
  • rimraf命令
  • Ubuntu基础操作
  • Ubuntu安装jenkins
  • Vscode无法执行npm等脚本的问题
  • Json

    • Countries
  • 简介
  • 设计原则
  • 行为型模式

    • 介绍
    • 策略模式
  • 创建型模式

    • 介绍
    • 单例模式
  • 结构型模式

    • 介绍
  • Docker指南

    • 介绍
    • 安装
  • Docker实例

    • 介绍
    • docker安装consul
    • docker安装elasticsearch
    • docker安装gitlab-runner
    • docker安装gitlab
    • docker安装jenkins
    • docker安装kafka
    • docker安装mongo
    • docker安装mysql
    • docker安装nginx
    • docker安装portainer
    • docker安装rabbitmq
    • docker安装redis
    • docker安装teamcity
  • Docker教程

    • Docker命令大全
    • docker nginx添加端口映射
    • docker服务管理
  • Docker-Compose

    • 网络配置
    • service name和container name
  • 世界上的另一个我
  • 计划生育宣传标语
  • IT术语
  • Single is simple, double is trouble
  • 矿泉水、纯净水、天然水究竟有啥区别
  • 联系
  • 捐赠
GitHub
  • Docker指南

    • 介绍
    • 安装
  • Docker实例

    • 介绍
    • docker安装consul
    • docker安装elasticsearch
    • docker安装gitlab-runner
    • docker安装gitlab
    • docker安装jenkins
    • docker安装kafka
    • docker安装mongo
    • docker安装mysql
    • docker安装nginx
    • docker安装portainer
    • docker安装rabbitmq
    • docker安装redis
    • docker安装teamcity
  • Docker教程

    • Docker命令大全
    • docker nginx添加端口映射
    • docker服务管理
  • Docker-Compose

    • 网络配置
    • service name和container name

docker安装nginx

首先拉取nginx镜像

docker pull nginx

然后运行一个名称为nginx-test的容器

docker run --name nginx-test -p 8080:80 -d nginx
  • --name nginx-test 将容器名称命名为nginx-test
  • -p 8080:80 将容器的80端口映射到宿主机的8080端口
  • -d 在后台运行容器

现在访问http://宿主机ip:8080地址,如果可以看到一个nginx的默认页面,说明nginx已经成功运行

如何将自己的网页发布到nginx呢?

认识Nginx

nginx中最重要的一个配置文件是nginx.conf,目录位置为/etc/nginx/,我们可以进入容器看看该文件

首先执行如下命令进入容器

docker exec -it nginx-test bash

然后进入nginx.conf文件所在的目录位置并查看该文件

cd /etc/nginx & cat nginx.conf

可以看到该文件内容大体如下

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

在http块中可以看到一行代码include /etc/nginx/conf.d/*.conf;,意思是将/etc/nginx/conf.d/目录下面所有的.conf文件包含进来

进入该目录可以看到其中有一个default.conf的默认配置文件,看一下大概内容

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    .............
}
  • listen 监听的端口号,默认为web默认端口80。这其实就是运行容器时的匹配端口
  • server_name localhost或域名
    • localhost 通过IP地址访问站点(上面运行容器后我们运行的就是ip地址)
    • 域名 做了域名解析后就可以通过该域名访问站点了
  • location /
    • root 站点目录,需要访问自己的站点就可以在这里实现
    • index 默认首页

提示

增加站点,在conf.d文件夹中添加.conf文件即可

目录映射

前面了解了nginx的知识点,知道要发布自己的站点只需要把自己的站点放在指定目录即可,但是在docker中没做目录映射我们是无法将文件存放在容器中的

我们把之前的容器移除并重新运行一个新的容器

# 停止容器
docker stop nginx-test

# 移除容器
docker rm nginx-test

运行一个带有目录映射的容器

docker run --name nginx -p 80:80 \
    -v /srv/nginx/etc/conf.d:/etc/nginx/conf.d \
    -v /srv/nginx/html:/usr/share/nginx/html \
    -d nginx 
  • -v /srv/nginx/etc/conf.d:/etc/nginx/conf.d 将容器中的/etc/nginx/conf.d目录映射到宿主机的/srv/nginx/etc/conf.d目录
  • -v /srv/nginx/html:/usr/share/nginx/html 将容器中的站点目录映射到宿主机的/srv/nginx/html目录

这样我们在宿主机对这两个目录的配置和修改即可同步到容器中

提示

修改配置后需要重启conf文件或者nginx容器才能生效

加密证书

如果需要加密证书访问,还需要映射443端口。如果是用的证书文件,还可以将存放证书的目录映射到宿主机

docker run --name nginx -p 80:80 -p 443:443 \
-v /srv/nginx/etc/conf.d:/etc/nginx/conf.d \
-v /srv/nginx/etc/cert:/etc/nginx/cert \
-v /srv/nginx/html:/usr/share/nginx/html \
-d nginx 

还需要修改对应的站点配置文件

server {
    listen       443 ssl;
    listen  [::]:443 ssl;
    server_name  localhost;

    # ssl证书地址
    ssl_certificate     /etc/nginx/cert/cert.pem;  # pem文件的路径
    ssl_certificate_key  /etc/nginx/cert/cert.key; # key文件的路径

    # ssl验证相关配置
    ssl_session_timeout  5m;    #缓存有效期
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    #加密算法
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #安全链接可选的加密协议
    ssl_prefer_server_ciphers on;   #使用服务器端的首选算法

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    ......
}

这样就可以通过带有https加密方式访问站点了

如果想把非加密方式访问直接跳转到加密方式可以再加一个server配置

server{
    listen 80;
    server_name www.example.com;
    rewrite ^(.*)$ https://$host$1 permanent;
}

重定向

重定向有两种方式:proxy_pass和rewrite

proxy_pass

访问server_name时,自动代理到proxy_pass地址

用法

server{
    listen  80;  
    server_name test.example.com; # 绑定域名
    location / {  
         proxy_pass http://127.0.0.1:8000;  # 指定端口号 8000
    }  
}

说明

  • 浏览器地址不会变化
  • 请求http://test.example.com,会被自动代理到http://127.0.0.1:8000地址

rewrite

用法

rewrite ^(.*)$ https://$host$1 permanent;

此用法和以下代码相同

return 301 https://$server_name$request_uri;

说明

  • 浏览器地址显示重定向后的url
  • 参数
    参数状态码说明
    last302结束当前的请求处理,用替换后的URI重新匹配location
    break302结束当前的请求处理,使用当前资源,不再执行location里余下的语句
    redirect302临时跳转
    permanent301永久跳转

示例

跳转到https协议请求

server{
    listen 80;
    server_name www.example.com;
    rewrite ^(.*)$ https://$host$1 permanent;
}

强制跳转到https

不管访问http://example.com、https://example.com还是http://www.example.com都跳转到https://www.example.com

server{
    listen 80;
    listen 443;
    server_name example.com www.example.com;
    set $flag 0;
    if ($scheme != 'https'){
     set $flag 1;
    }
    if ($host != 'www.example.com'){
     set $flag 1;
    }
    if ($flag = 1){
        rewrite ^/(.*)$ https://www.example.com/$1 permanent;
        # return 301 https://www.example.com$request_uri;
    }
}

相关链接

Docker教程:使用Docker容器运行Nginx并实现反向代理

Prev
docker安装mysql
Next
docker安装portainer