docker x nginx通过docker使用nginx
Posted Dragon_qx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker x nginx通过docker使用nginx相关的知识,希望对你有一定的参考价值。
文章目录
nginx初始化
docker拉取nginx镜像
[root@Dragon ~]# dk pull nginx
实例化nginx镜像
[root@Dragon ~]# dk run -it --name nginx1 -p 80:80 nginx /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
有一个警告意思是ipv4的转发未开启先不管
启动nginx
找一下启动文件
root@65493cd4789a:/usr/local/sbin# find / -name nginx
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx
find: '/proc/1/map_files': Operation not permitted
find: '/proc/11/map_files': Operation not permitted
/usr/lib/nginx
/usr/sbin/nginx
/usr/share/doc/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx
/usr/sbin/nginx看起来比较像
root@65493cd4789a:/usr/local/sbin# cd /usr/sbin
root@65493cd4789a:/usr/sbin# ./nginx
2021/10/26 12:47:04 [notice] 13#13: using the "epoll" event method
2021/10/26 12:47:04 [notice] 13#13: nginx/1.21.3
2021/10/26 12:47:04 [notice] 13#13: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/26 12:47:04 [notice] 13#13: OS: Linux 3.10.0-1160.el7.x86_64
2021/10/26 12:47:04 [notice] 13#13: getrlimit(RLIMIT_NOFILE): 1048576:1048576
有几行notice先不管
查看nginx配置文件
root@65493cd4789a:/usr/sbin# find / -name nginx.conf
/etc/nginx/nginx.conf
find: '/proc/1/map_files': Operation not permitted
find: '/proc/14/map_files': Operation not permitted
find: '/proc/15/map_files': Operation not permitted
find: '/proc/19/map_files': Operation not permitted
root@65493cd4789a:/usr/sbin# cat /etc/nginx/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;
}
在宿主机浏览器顺利访问到nginx的welcome页面
nginx常用命令
nginx命令需要在nginx的目录下才能使用
查看nginx版本号
root@e137e425fbf3:/usr/sbin# ./nginx -v
nginx version: nginx/1.21.3
关闭nginx
root@e137e425fbf3:/usr/sbin# ./nginx -s stop
2021/10/26 13:47:45 [notice] 42#42: signal process started
启动nginx
./nginx
重新加载nginx
可加载配置文件里的内容
./ nginx -s reload
nginx配置文件
先创建nginx的容器数据卷
在root/nginx目录下创建www、logs、conf目录
- conf:nginx配置文件目录
- logs:nginx日志目录
- www:nginx存储网站网页目录
拷贝配置文件到本地
[root@Dragon ~]# dk cp nginx1:/etc/nginx/nginx.conf /root/nginx/conf
创建新的容器并将www、logs、conf目录映射到本地
docker run -d -p 80:80 --name d_nginx -v /root/nginx/www:/usr/share/nginx/html -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx nginx
这样就可以在容器外编辑配置文件了
配置文件由四部分组成
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配
置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数, 进程 PID 存放路径、日志存放路径和类型以
及配置文件的引入等。
worker_processes auto;
这是 Nginx 服务器并发处理服务的关键配置, worker_processes 值越大,可以支持的并发处理量也越多,但是
会受到硬件、软件等设备的制约
events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word
process 可以同时支持的最大连接数等。
events {
worker_connections 1024;
}
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置
http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是: http 块也可以包括 http 全局块、 server 块。
http全局块
http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
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;
}
server块
在/etc/nginx/conf.d/目录下的default.conf中
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了
节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、 location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓
存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
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;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the php scripts to Apache listening on 127.0.0.1:80
#
#location ~ \\.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \\.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\\.ht {
# deny all;
#}
}
nginx配置反向代理
简单代理
拉取tomcat镜像,映射到8080端口
[root@Dragon conf]# dk run -d -p 8080:8080 --name d_tomcat tomcat:8.0.52
我们直接在http块中添加自定义的server块即可,配置80端口的请求转发到tomcat的8080端口
server{
listen 80;
charset utf-8;
server_name 192.168.152.161;
location / {
proxy_pass http://192.168.152.161:8080;
proxy_redirect default;
}
}
重启d_nginx镜像,再次用宿主机浏览器访问虚拟机80端口,成功访问到tomcat的welcome页面。反向代理成功!
复杂代理
准备两个jar程序分别在8888端口和9999端口,配置server块让访问虚拟机的uri中带有index.html的转发到9999端口,uri中带有cartoonIndex.html的转发到8888端口。
server{
listen 80;
charset utf-8;
server_name 192.168.152.161;
location ~/cartoonIndex.html {
proxy_pass http://192.168.152.161:8888;
}
location ~/index.html {
proxy_pass http://192.168.152.161:9999;
proxy_redirect default;
}
这里只是一个简单的例子,这个只转发了两个页面,其余的东西没有转发。正常情况下应该配置路径
。
nginx配置负载均衡
将同一个请求平均分到两个服务器上
配置负载均衡时要把默认配置include /etc/nginx/conf.d/*.conf;删除
upstream myserver {
server 192.168.152.161:8888;
server 192.168.152.161:9999;
}
server{
listen 80;
charset utf-8;
server_name 192.168.152.161;
location / {
proxy_pass http://myserver;
}
}
默认负载均衡的策略时轮询
轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
weight
指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver {
server 192.168.152.161:8888 weight=10;
server 192.168.152.161:9999 weight=15;
}
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream myserver {
ip_hash;
server 192.168.152.161:8888;
server 192.168.152.161:9999;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.152.161:8888;
server 192.168.152.161:9999;
fair;
}
nginx配置动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和
静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx
处理静态页面, Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使
浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资
源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码
304,如果有修改,则直接从服务器重新下载,返回状态码 200。
server{
listen 80;
charset utf-8;
server_name 192.168.152.161;
location /www/ {
root /data;
index index.html index.htm;
autoindex on;
}
location /image/ {
root /data/;
autoindex on;
}
}
以上是关于docker x nginx通过docker使用nginx的主要内容,如果未能解决你的问题,请参考以下文章
docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https