使用docker部署nginx

部署nginx

  1. 搜索nginx镜像
1
docker search nginx
  1. 拉取nginx镜像
1
docker pull nginx
  1. 创建容器 设置端口映射
1
2
3
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
  1. 创建nginx配置文件 否则下一步会报错
1
2
3
mkdir conf
cd conf
touch nginx.conf
  1. nginx.conf配置文件中添加以下配置信息(如果配置信息不对会导致无法正常启动)
1
2
3
4
5
6
7
8
9
10
11
12
worker_processes  1;
events {
worker_connections 1024;
}
http{
server{
listen 80;
server_name your_server_name; #erverName
root /usr/share/nginx/html;
index index.html;
}
}
  1. 创建并运行容器
1
2
3
4
5
6
7
8
docker run -id \
-p 80:80 \
--name=c_nginx \
-h c_nginx \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx:latest
  • 参数说明
    • -p 80:80 将容器的80端口映射到主机的80端口
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
      -v $PWD/logs:/var/log/nginx
      -v $PWD/html:/usr/share/nginx/html \ 将主机中当前目录挂载到容器
    • -h 设置容器的hostname
    • $PWD表示当前所在目录
    • –name:表示容器别名, 但凡是两个杠都需要带=

关于配置文件的修改

配置文件一旦修改需要重启nginx才生效, 重启前建议提前测试一下配置文件语法是否存在问题, 可以进入容器中, 执行以下指令进行测试:

1
nginx -t

image-20220920144752833

除了借助docker重启容器外, 还可以在容器内部直接执行nginx指令实现重载:

1
nginx -s reload

附带配置文件内容参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#主模块指令,指定Nginx Worker进程运行用户以及用户组
user nginx;
#主模块指令,指定Nginx要开启的进程数,建议设置成和cpu的数量相等
worker_processes 1;
#主模块指令,定义全局错误日志文件;日志级别:debug、info、notice、warn、error、crit
error_log /var/log/nginx/error.log warn;
#主模块指令,指定进程pid的存储文件位置
pid /var/run/nginx.pid;
#事件指令,设定Nginx的工作模式及连接数上限
events {
#指定Nginx的工作模式;Nginx工作模式:select、poll、kqueue、epoll、rtsig和/dev/poll
use epoll; #epoll工作模式是首选
#定义Nginx每个进程的最大连接数,默认是1024
worker_connections 1024;
}
#HTTP服务器配置
http {
#主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
include mime.types;
#HTTP核心模块指令,默认类型为二进制流
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;
#指定Nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,必须设为on,
#注:如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#防止网络阻塞
#tcp_nopush on;
#连接超时时间
keepalive_timeout 65;

一、Web服务器
------------------------------------------------------------------------------------------------
#server虚拟主机配置
server {
#监听端口号
listen 80;
#域名:可有多个,支持种类:通配符名称、正则表达式名称、IP、localhost、其他(_、@)
server_name *.example.org;
~^(www\.)?(.+)$;
101.200.149.141;
...
localhost;
_;
#location URL匹配配置
#配置根目录转发到本机目录位置
location / {
root /usr/share/nginx/project_1/dist;
index index.html index.htm; # 主页现寻找index.html,如果没有index.html,再寻找index.htm
}

error_page 404 /404.html;

location = /40x.html {
}
error_page 500 502 503 504 /50x.html;

location = /50x.html {
}
}

二、反向代理(配置SSL证书,http转发到https)
------------------------------------------------------------------------------------------------
#web-http
server {
listen 80;
server_name www.xxxxxx.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;#将80端口的访问转发到443端口
}
#web-https
server {
listen 443 ssl;
server_name www.xxxxxx.com;
#ssl on; #需要注释,命令过时(1.15.0版本以后)
#配置证书的路径
ssl_certificate cert/2547204_www.xxxxxx.com.pem; #使用相对路线,放在nginx目录下,绝对路径报错
ssl_certificate_key cert/2547204_www.xxxxxx.com.key;
#ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;

#配置根目录转发到相应端口(例,82端口)使用单机服务
location / {
proxy_pass http://172.241.27.9:82; #nginx and tomcat 在同一台机器,使用http链接
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}

error_page 404 /404.html;

location = /40x.html {

}
error_page 500 502 503 504 /50x.html;

location = /50x.html {

}
}

三、负载均衡
------------------------------------------------------------------------------------------------
#设定负载均衡的服务器列表
#1.轮询(默认):
#每个请求按时间顺序逐一分配到不同的后端服务器,如果某台服务器宕机将被自动剔除,使用户访问不受影响
upstream myapp1 {
#i.down表示当前的server暂时不参与负载均衡;
server 192.168.8.1:28 down;
#ii.backup:预留的备份机器。
server 192.168.8.2:80 backup;
server 192.168.8.3:80;
}
#2.Weight权重:
#指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下
upstream myapp2 {
server 192.168.8.1:28 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
#3.ip_hash:
#每个请求按访问IP的hash结果分配,自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
upstream myapp3 {
ip_hash;
server 192.168.8.1:28;
server 192.168.8.2:80;
#iii.max_fails允许请求失败的次数,默认1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
#iv.fail_timeout在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
server 192.168.8.3:80 max_fails=6 fail_timeout=20s;
server 192.168.8.4:80;
}
#4.fair:更加智能的负载均衡算法。依据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
# 注:Nginx本身是不支持fair,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
#5.url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
# 注:Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash软件包。

server {
listen 80;
server_name www.hanxiaozhang.xyz;
location / {
proxy_pass http://myapp1;
}
}

}

注意事项

如果对Nginx配置文件进行了修改操作, 需要重启Nginx容器才能生效

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%