本文章中将简单介绍 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 地址。