Nginx docker 部署简单教程

398 阅读2分钟

本文章中将简单介绍 nginx 网站的部署流程,你将用到以下工具

  • docker
  • html 页面

docker 安装 nginx

首先在特定目录下创建 nginx 及关联目录。在 windows 下一个常见的 nginx 的目录结构如下图

这里我们主要用到

  • html: 存放前端页面的文件夹
  • conf: 存放 nginx 相关配置文件
  • logs: 日志

因此,我们创建这三个文件夹,后续与 docker 实例建立关联

# 创建文件夹
mkdir -p ~/containers/nginx/{html,conf,logs}

# 创建 nginx 容器
docker run --name nginx \
-p 80:80 \
-p 443:443 \
-v ~/containers/nginx/html:/usr/share/nginx/html \
-v ~/containers/nginx/conf:/etc/nginx/conf.d \
-v ~/containers/nginx/logs:/var/log/nginx \
--restart=always \
-d nginx

nginx 部署页面

docker 容器里的 nginx 实例的配置结构与 windows 下有些不同,我们进入容器的 /etc/nginx/ 文件夹,可以看到

# 进入容器的 bash 控制台
docker exec -it nginx bash
# 进入该目录
cd /etc/nginx/
ls
# output: conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

可以看到该目录下有个 nginx.conf,这个配置文件是容器自带的主配置文件,我们自己的配置文件需要在 conf.d/ 文件夹里面定义 *.conf 文件

简单看下 nginx.conf 的内容

root@6841eab8ca8d:/etc/nginx# cat nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /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;
    # 这里引入 conf.d 文件夹的 conf 配置文件
    include /etc/nginx/conf.d/*.conf;
}

可以看到 nginx.conf 已经帮我们配置常用配置,具体服务器,后端代理url等 server 级别的配置需要我们在 conf.d 文件夹里面定义。

这里我定义了一个 app.conf 配置文件

# docker 里面是 server 级别的配置
server {
    listen       80; # nginx 监听的端口
    server_name  localhost;
    # 指定前端项目所在的位置
    location / {
        # 使用 docker 内部的绝对路径, 我这里使用的是 /usr/share/nginx/html/main
        root   /usr/share/nginx/html/<your_fronend_project_dir>; 
        index  index.html index.htm;  
        try_files $uri $uri/ /index.html;  # 支持前端路由
    }

    error_page   500 502 503 504  /50x.html;  # 响应错误页面,这里的 / 目录是 html/ 目录
    location = /50x.html {
        root   /usr/share/nginx/html; # 使用 docker 内部的绝对路径
    }
    
    # 后端配置
    location /api {  
        default_type  application/json;
        
        #支持keep-alive  
        proxy_http_version 1.1;  
        keepalive_timeout   30s;  
        keepalive_requests  1000;  
        
        
        # 路径重写(移除/api前缀)
        # rewrite ^/api(/.*)$ $1 break;
        rewrite /api(/.*) $1 break;  
        
        # 请求头处理
        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_pass_request_headers on;
        
        #more_clear_input_headers Accept-Encoding;  4
        
        
        # 负载均衡
        # proxy_pass http://127.0.0.1:8081;	# 后端
        proxy_pass http://backend;
        
        # 错误处理
        proxy_next_upstream error timeout invalid_header http_500 http_502;
    }
}
# 后端实例
upstream backend {
    # 后端负载均衡
    # 可以将 nginx 和 后端项目放在同一个 network 里面,然后就可以用 docker 容器别名了
    server <your_backend_name>:8081 max_fails=5 fail_timeout=10s weight=1;
}

完成上述操作后,基本上配置好了 nginx ,如果nginx没有启动成功,或者 docker ps 查看的 nginx 实例一直处于重启状态,
那可能就是配置文件出了问题,例如,后端服务未启动... 可以先将后端服务相关的配置 location, upstream 配置先注释。

接下来我们上传一个简单的 html 页面,我们命名为 index.html 并上传到本地路径(创建容器时与容器内部路径关联的本地路径) ~/containers/nginx/html/main

<!DOCTYPE html>
<html lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>vividbobby</title>
</head>
<body>
    <h1>Personal Website</h1>
    <div>
        This is a personal web for vividbobby.
    </div>
</body>
</html>

然后在浏览器上通过 ip:port 就可以访问该页面了。

总结

这里简单的介绍了如何利用 docker 部署 nginx 页面。主要是在配置 *.conf 文件,包括代理定位的 url ( location / ),
配置后端服务,包括负载均衡 (upstream backend)。同时如果是在 docker 环境里面,同处于一个虚拟网络内,
可以通过实例名称进行配置,否则就需要通过 ip 地址。