nginx的docker-compose部署安装及配置


本人亲测在本地虚拟机部署完毕,本地web程序通过Nginx进行跳转。

1 docker-compose.yml文件

version: '3.1'
services:
    nginx:
        image: nginx     # 镜像名称
        container_name: nginx     # 容器名字
        restart: always     # 开机自动重启
        ports:     # 端口号绑定(宿主机:容器内)
            - '5080:80'
            - '443:443'
        volumes:      # 目录映射(宿主机:容器内)
            - ./conf/nginx.conf:/etc/nginx/nginx.conf###配置文件
            - ./log:/var/log/nginx  ###这里面放置日志
            - ./html:/html         ###这里面放置项目目录

2 在docker-compose.yml同级目录建立3个文件夹

mkdir conf  log  html

3 nginx.conf配置

将其放置在./conf目录下。

worker_processes  1;
events {
   worker_connections  1024;
}
http {
   include       mime.types;
   default_type  application/octet-stream;
   sendfile        on;
   keepalive_timeout  65;
   server {
       listen       80;
       #该ip是虚拟机地址,根据实际情况修改。
       server_name 192.168.0.110;
       location / {
          # Nginx解决浏览器跨域问题
          add_header Access-Control-Allow-Origin *;
          add_header Access-Control-Allow-Headers X-Requested-With;
          add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
          root   /html;
          index  index.html index.htm;
       }
	   location  /abc {
			default_type text/plain;
			return 200 "access success";
		}
	   location  /api { 
	        # 填写需要跳转的API地址 ,根据实际情况修改。                      
            proxy_pass http://192.168.0.3:8789/data; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			# Nginx解决浏览器跨域问题
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
       }
   }
}
 以下nginx.conf配置说明:仅供参考,未验证。
1)全局块

​ 配置影响 nginx 全局的指令。一般有运行 nginx 服务器的用户组、nginx 进程 pid 存放路径、日志存放路径、配置文件引入、允许生成 worker process 数等;
​ 所有在 nginx.conf 内但不在任何 { } 中的指令都属于全局块的指令:

# 用户组
user myUsr myGroup;
# 工作进程数
worker_processes  1;
# 进程文件路径
pid /user/local/nginx/nginx.pid;
# 日志路径和日志级别
error_log logs/error.log debug;
(1)指令详解
  • ​ 用户或用户组默认为 nobody;
  • ​ 工作进程数可以设置为CPU的核心数;
  • ​ 日志级别有:debug|info|notice|warn|error|crit|alert|emerg
  • ​ 注意:Nginx 配置中,以 / 开头的路径表示绝对路径,不以 / 开头的路径表示相对路径,相对路径的根目录为 Nginx 的根目录。
2)Events 块

​ 配置影响 nginx 服务器或与用户的网络连接。有每个进程的最大连接数、选取哪种事件驱动模型处理连接请求、是否允许同时接受多个网路连接、开启多个网络连接序列化等;
​ 所有写在 events{} 中的指令都属于 Events 块指令:

events {
	# 设置网路连接序列化
	accept_mutex on;
	# 一个进程是否同时接受多个网络连接
	multi_accept on;
	# 事件驱动模型
	use epoll;
	# 最大连接数
	worker_connections  1024;
}
(1)指令详解
  • 设置网路连接序列化是为了防止惊群现象发生,默认为 on
  • 是否同时接受多个网络连接指令默认值为 off
  • 事件驱动模型的可选项有:select|poll|kqueue|epoll|resig|/dev/poll|eventport
3)Http 块

​ 可以嵌套多个 server、配置代理、缓存、日志定义等绝大多数功能和第三方模块的配置。如文件引入、mime-type 定义、日志自定义、是否使用 sendfile 传输文件、连接超时时间、单连接请求数等;
​ 所有写在 http{} 块中,但不写在 http{ } 内的子模块中的所有指定就是 HTTP 全局块,会影响 http{ } 及其子模块的内容:

http {
	# 文件扩展名与文件类型映射表
	include mime.types;
	# 默认文件类型
	default_type  application/octet-stream;
	# 是否开启服务日志
	access_log off;
	# 自定义服务日志格式
	log_format myLogFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
	# 设置日志的格式
	access_log log/access.log myLogFormat;
	# 是否开启高效文件传输模式
	sendfile on;
	# 每个进程每次最大传输值
	sendfile_max_chunk 100k;
	# 长连接超时时间
	keeplive_timeout 100;
	# 响应客户端的超时时间
	send_timeout 75;
	# 客户端请求头的区缓冲区大小
	client_header_buffer_size 32k;
	# 客户端请求头的最大缓冲区数量和大小
	large_client_header_buffers 8 32k;
	# 允许客户端请求的最大字节数
	client_max_body_size  10m;
	# 客户端请求体的缓冲区大小
	client_body_buffer_size  128k;
}
(1)指令详解
  • 文件扩展名与文件类型映射表在 nginx/conf 下;
  • 默认文件类型的默认值为 text/plain;
  • 是否开启服务日志的默认值为 on,开启了之后需要配置 access_log 路径;
  • 自定义日志格式的更多变量请参考:【Nginx】之常用内置变量
  • sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,减少用户空间到内核空间的上下文切换;对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载;
  • sendfile_max_chunk 指令的默认为 0,表示不设上限;
  • keeplive_timeout 指令的单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置;长连接在请求大量小文件的时候,可以减少重建连接的开销;但如果上传大文件时在设置的超时时间内没上传完成会导致失败,如果设置时间过长,用户又多,长时间保持连接会占用大量资源;
  • send_timeout 指令仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接;
  • 使用 client_header_buffer_size 指令时,为避免请求 header 过大出现 400 错误,可以适当设置大一点;
  • 使用 large_client_header_buffers 指令时,为避免请求 header 过大出现 400 错误,可以适当设置大一点。
    除了这些常用的 http 配置外,还用一些特定的 http 配置,比如反向代理配置:
(2)反向代理配置
http {
    ...
    # 配置 https_proxy 反向代理
    proxy_connect_timeout  75;
    proxy_read_timeout  75;
    proxy_send_timeout 100;
    proxy_buffer_size  4k;
    proxy_buffers  4  32k;
    proxy_busy_buffers_size  64k;
    proxy_max_temp_file_size  64k;
    proxy_temp_file_write_size 64k;
    proxy_temp_path  proxy_temp;
    ...
}

http_proxy 模块指令详解:

  • proxy_connect_timeout :表示 Nginx 跟代理服务器连接超时时间;
  • proxy_read_timeout :表示 Nginx 与代理服务器两个成功的响应操作之间超时时间;
  • proxy_send_timeout :表示 Nginx 传输文件至代理服务器的超时时间;
  • proxy_buffer_size :用于设置从代理服务器读取并保存用户头信息的缓冲区大小;
  • proxy_buffers :设置代理缓冲区大小,Nginx 针对单个连接,缓存来自代理服务器的响应,网页平均在32k以下的话,可以设置为 4 32K ;
  • proxy_busy_buffers_size :设置高负荷下的缓冲大小,一般为 proxy_buffers 的两倍;
  • proxy_max_temp_file_size :的用途介绍:当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与 proxy_cache 没有关系;大于这个值,将从 upstream 服务器传回,设置为 0 禁用;
  • proxy_temp_file_write_size :当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小;
  • proxy_temp_path :用于指定临时文件所在的目录。
(3)http_gzip模块配置
http {
    ...
    # 配置 http_gzip 模块
    gzip on;
    gzip_min_length 1K;
    gzip_buffers  4  16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json;
    gzip_proxied any;
    gzip_vray on;
    ...
}

http_gzip 配置详解:

  • gzip :如果设置为 on 则表示开启 gzip 压缩输出,可减少网络传输;
  • gzip_min_length :设置允许压缩的页面最小字节数(到达这个大小才进行压缩),页面字节数从 header 头的 content-length 中进行获取。默认值是 20。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
  • gzip_buffers :设置系统获取多少个单位的缓存用于存储 gzip 的压缩结果数据流,4 16k 表示按照原始数据大小以 16k 为单位的 4 倍进行内存申请;
  • gzip_http_version :设置 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项;如果你用了 Nginx 的反向代理并启用 Gzip 压缩的话就需要加上,而由于末端通信是 http/1.0,故请设置为 1.0;
  • gzip_comp_level :zip 压缩比,为 1 时,压缩比最小处理速度最快;为 9 时,压缩比最大但处理速度最慢;
  • gzip_types :匹配 mime 类型进行压缩,无论是否指定,text/html 类型总是会被压缩的;
  • gzip_proxied :置开启或者关闭后端服务器返回的结果是否压缩,Nginx 作为反向代理的时候启用,匹配的前提是后端服务器必须要返回包含 Via 的 header头;
  • gzip_vray : 该配置和 http 头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过 gzip 压缩的页面,例如:用 Squid 缓存经过 Nginx 压缩的数据。
    负载均衡后台服务器列表:
upstream backend {
	server 192.168.56.10:8080 max_fails=2 fail_timeout=30s backup; # 热备
	server 192.168.56.11:8080 max_fails=2 fail_timeout=30s;
}
4)Server 块

​ 配置虚拟主机的相关参数,一个 http 中可以有多个 server;

所有位于 server{} 模块中的指令都属于 Server 块指令:

server {
    # 监听端口
    listen 8080;  
    # 监听服务器地址
    server_name 192.168.56.10;
    # 每个连接请求上限次数
    keepalive_requests 120;
    # 字符集
    charset utf-8;
    # 服务日志所在目录以及日志格式
    access_log logs/host80.log myLogFormat;
    # 错误页
    error_page  404  /404.html;
	error_page  500 502 503 504  /50x.html;
}
(1)指令详解
  • 监听的端口,默认80,小于1024的要以root启动;
  • 监听的服务器地址可以是 IP 或者域名,并且可以使用正则表达式进行匹配;
  • 日志格式的定义和 http 模块的定义方式相同;
  • 错误页的地址为:server_name + error_page。

除了以上常用的 Server 块指令外还有其他特殊的指令,比如 ssl 模块,在请求方式中,如果使用 https 进行请求的话是需要证书,这时就要对 https 请求设置 ssl:

(2)设置 ssl
server {
	# 开启 ssl
	ssl on;	
	# ssl 证书路径
	ssl_certificate /opt/ssl/nginx.crt;
	# ssl 证书秘钥
	ssl_certificate_key /opt/ssl/nginx.key;
	# ssl 会话超时时间
	ssl_session_timeout 1d;
	# ssl 缓存
	ssl_session_cache shared:SSL:50m;
	# ssl 会话票据
	ssl_session_tickets off;
	# ssl 协议版本
	ssl_protocols TLSv1.2;
	# ssl 密码套件
	ssl_ciphers  'HIGH:!aNULL:!MD5';
	# 开启 ssl 服务密码套件
	ssl_prefer_server_ciphers on;
}
5)Location 块
	配置请求的路由,以及各种页面的处理情况。

常用 location 指令:

location  ~*  ^.+$ {
	# 服务器的默认网站根目录位置
    root /var/www/html; 
    # 默认访问的文件名
    index  index.html index.htm index.jsp;
	# 拒绝的 IP
	deny 192.168.56.21;
	deny all;
	# 允许的 IP 
	allow 192.168.56.10;
	allow all;
}
(1)指令详解
  • 紧跟在 location 后面的是 location 模块监听的 url 地址,也就是 location 块的匹配规则,只有匹配正确的地址才会进入该 location 块,可以使用正则表达式进行匹配(表示区分大小写,* 表示不区分大小写);
  • root :定义服务器的默认网站根目录位置,如果 LocationURL 匹配的是子目录或文件,root 指令没什么作用,一般放在 server 指令里面或 LocationURL 为 / 的 location 块下;
  • index :定义该 location 路径下默认访问的文件名,一般跟 root 的路径放在一起。
(2)设置响应头

(可用于访问控制和处理跨域问题):

location {
    # 设置允许跨域类型
    add_header Access-Control-Allow-Origin * always;
    # 是否允许信任证书
    add_header Access-Control-Allow-Credentials 'true' always;
    # 允许的请求头类型
    add_header Access-Control-Allow-Headers * always;
    # 设置允许的请求方式
    add_header Access-Control-Allow-Methods 'PUT, GET, POST, DELETE, OPTIONS' always;
    # 处理 OPTIONS 请求
    if ($request_method = 'OPTIONS') {
        return 204;
    }
}

指令详解:

  • 为了避免出现失效问题,一般在都在最后面添加 always
  • 允许的请求头类型包括:Origin、X-Requested-With、content-Type、Accept、Authorization、uuid
(3)设置反向代理服务器
location {
    # 反向代理服务器地址
    proxy_pass  http://192.168.56.33;
    # 是否重定向代理服务器地址
    proxy_redirect off;
}
(4)设置向代理服务器发送请求时的请求头数据
location {
    # cookie
    proxy_pass_header  Set-Cookie;
    # 主机名
    proxy_set_header Host $host;
    # 真实 IP
    proxy_set_header X-Real-Ip $remote_addr;
    # 表示 HTTP 请求端真实 IP
    proxy_set_header X-Forwarded-For $remote_addr;
}
6)注意

​ Nginx 配置的注释是以 # 开头,并且每条语句都要以 ; 结束,除了语句块 {}。

4 index.html

将其放置在./html目录下。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>docke-compose搭建nginx</title>
</head>
<body>
    <h1>docke-compose搭建nginx映射成功</h1>
</body>
</html>

5 启动

docker-compose up -d

其他命令参考

# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中 nginx 服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q

#查看日志
docker-compose logs nginx

# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx

# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx

# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx

6 验证

1)浏览器验证首页访问
地址:http://你的虚拟机ip:5080

在这里插入图片描述

2)通过postman工具验证api数据。

以下消息内容是自己编写的web程序,仅是示意。
在这里插入图片描述

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值