nginx (入门介绍、反向代理、负载均衡、动静分离)

nginx 的简介

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx的应用场景
1、http服务器。nginx是一个http服务可用独立提供http服务。可用做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟多个网站。例如个人网站使用的虚拟主机。

  • 基于端口,不同的端口
  • 基于域名,不同的域名

3、方向代理,负载均衡。当网站到达一定程度后,单台服务器不能满足用户的请求时,需要用到多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载均衡,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

基于Docker安装以及运行

1,下载最新nginx镜像

docker pull nginx

2,运行nginx容器

docker run -id -p 80:80 nginx

在这里插入图片描述
3,重启nginx容器:

docker restart 容器id

4,关闭nginx容器:

docker stop 容器id

Nginx原理以及配置文件讲解

我们如何来找nginx的安装目录呢,有两种方法;

第一种:通过dockerfile的定义来看;

第二种,简单粗暴,直接搜索

find / -name nginx

在这里插入图片描述
配置文件介绍
nginx.conf 配置文件介绍

# 配置worker进程运行用户
user  nginx;
# 配置过程进程数目,根据硬件配置,一般是和CPU数量一致,或者CPU数量的两倍,达到最佳性能。
worker_processes  1;
# 配置全局错误日志文件以及配置级别  [ debug | info | notice | warn | error | crit ]

#关于日志级别:
#在配置nginx.conf 的时候,有一项是指定错误日志的,默认情况下你不指定也没有关系,因为nginx很少有错误日志记录的。但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题。
#error_log 级别分为 debug, info, notice, warn, error, crit  默认为crit, 该级别在日志名后边定义格式如下:
#error_log  /your/path/error.log crit;  
#crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。

error_log  /var/log/nginx/error.log warn;
# 配置进程pid文件
pid        /var/run/nginx.pid;        

#events 是配置工作模式和连接数
events {
    worker_connections  1024; # 配置每个worker进程连接数上限
}
#说明:nginx支持得总连接数=worker_processes * worker_connections 

#配置http服务器
http {
    include       /etc/nginx/mime.types;  # 配置nginx支持哪些多媒体类型
    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;              #开启gzip压缩输出

    include /etc/nginx/conf.d/*.conf;
}

_default.conf

server {
    listen       80;         #  监听端口
    server_name  localhost;  #  配置服务名

    #charset koi8-r;         # 配置字符集
    #access_log  /var/log/nginx/host.access.log  main;   #配置本虚拟主机访问日志

    # 匹配/请求 ,/是根路径请求,会被该location匹配到并且处理
    location / {
        root   /usr/share/nginx/html;   #root是配置服务器的默认网关根目录位置
        index  index.html index.htm;    #配置首页文件的名称
    }

    #error_page  404              /404.html; #配置404页面

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;   #配置50x错误页面
    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容器

为后续方便修改nginx的配置文件,我们将nginx的配置目录copy到宿主机,将其作为新nginx容器启动的共享目录;

cd /home
mkdir data
docker cp 容器ID:/etc/nginx /home/data/nginx

反向代理

什么是代理服务器?

代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
在这里插入图片描述

为什么要使用代理服务器?

1,提高访问速度

  • 由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。

2,防火墙作用

  • 由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。

3,通过代理服务器访问不能访问的目标站点

  • 互联网上有许多开放的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。

什么是正向代理?

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 Http 请求发送到代理服务器中。

什么是反向代理?

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。

实现反向代理
1、启动nginx

docker run -it --name=myNginx -v /home/data/nginx:/etc/nginx -p 80:80 nginx

2、启动tomcat

docker run -d  -p 8080:8080  tomcat镜像id

3、在docker 默认的是桥接模式,回给分配不同的主机。需要使用如下命令查看所分配的IP

docker inspect 容器ID

在这里插入图片描述
在这里插入图片描述
4、修改default.conf配置

  • tomcat:172.17.0.3:8080
    nginx:172.17.0.2
    在这里插入图片描述
    5、本机修改hosts可以搞个域名映射本机 C:\Windows\System32\drivers\etc
    在这里插入图片描述

6、重启nginx容器(通过nginx访问tomcat)
在这里插入图片描述

nginx负载均衡

网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。

nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。

反向代理+负载均衡的配置
在这里插入图片描述

1、宿主机里home目录下新建tomcat1和tomcat2目录,复制容器里conf,webapps到宿主机

docker cp  30e862c2d8f1:/usr/local/tomcat/conf  /home/tomcat1
docker cp  30e862c2d8f1:/usr/local/tomcat/webapps  /home/tomcat1

在这里插入图片描述

在这里插入图片描述


2、修改共享目录tomcat1、tomcat2中的文件(server.xml、index.jsp),用于查看负载均衡的效果;

docker run -d --name tomcat1 -p 8080:8080 -v /home/tomcat1/conf/:/usr/local/tomcat/conf/  -v /home/tomcat1/webapps/:/usr/local/tomcat/webapps/  635d3cfe400a

docker run -d --name tomcat2 -p 9090:9090 -v /home/tomcat2/conf/:/usr/local/tomcat/conf/  -v /home/tomcat2/webapps/:/usr/local/tomcat/webapps/   635d3cfe400a

在这里插入图片描述
运行两条命令之后如上图是否在容器运行,这个时候的 9090 端口是不可以运行的。为了能够访问和查看负载均衡的效果;就需在共享目录修改这两个文件:server.xml、index.jsp
注意:修改这玩意只是为了看效果
在ROOT目录下修改index.jsp 去掉它的页面效果,留下一个8080 方便区别。另一个也如此。
在这里插入图片描述

修改端口号。修改之后需要重启该容器
在这里插入图片描述


3、修改 nginx.conf 指定具体代理的目标服务器

 upstream www.hyf.com{
         server 172.17.0.3:8080 weight=1;
         server 172.17.0.4:9090 weight=2;
    }

在这里插入图片描述
4、在defalut.conf 中修改 :server_name 配置访问的域名erver.location指定跳转到目标服务器
在这里插入图片描述

测试:
重启 nginx 容器,输入网址 www.hyf.com
在这里插入图片描述

效果:
加了 weight 权重策略,9090 端口的值大,访问的次数较多。
在这里插入图片描述

在这里插入图片描述

负载均衡策略

每个请求轮流分配到不同的后端服务器,如果后端服务器挂掉,则自动被剔除;
参考配置:

upstream www.hyf.com{
         server 172.17.0.3:8080 ;
         server 172.17.0.4:9090 ;
}

weight权重
根据weight权重,请求会根据权重比例分发给不同后端服务器,weight权重越高,分配的比例越大;
实际分配,根据服务器硬件配置高低,来具体分配weight权重,硬件配置高的,weight就配置高点;

参考配置:

upstream www.hyf.com{
	 server 172.17.0.3:8080 weight=1;
	 server 172.17.0.4:9090 weight=2;
}

ip_hash
ip_hash策略是根据用户客户端的IP的hash值来分配具体服务器,这样每个访问客户端都会固定访问某一个服务器,这样可以解决session丢失问题,很多网站都采用这种策略来搞负载均衡,主要考虑到session问题;

参考配置:

upstream www.hyf.com{
	 ip_hash;
	 server 172.17.0.3:8080 ;
	 server 172.17.0.4:9090 ;
}

least_conn最少连接
web请求会被分发到连接数最少的服务器上;

参考配置:

upstream www.hyf.com{
	 least_conn;
	 server 172.17.0.3:8080 ;
	 server 172.17.0.4:9090 ;
}

负载均衡备份与宕机

备份 backup配置;
其他非backup机器挂掉后,才会请求backup机器;

参考配置:

upstream www.hyf.com{
	 server 172.17.0.3:8080 ;
	 server 172.17.0.4:9090 backup ;
}

宕机 down配置;
配置down的服务器不参与负载均衡;这样down所标记的服务器可以安心的升级了;

参考配置:

upstream www.hyf.com{
	 server 172.17.0.3:8080 ;
	 server 172.17.0.4:9090 down ;
}

这两个配置很多时候用于运维,维护某个机器的时候用;

nginx动静分离

静动分离,就是将css、js、jpg等静态资源和jsp等动态资源分开处理,以此提高服务器响应速度,提高性能。


操作实现

1、先搞一个静态资源服务器

  • 复制宿主机nignx共享目录nginx2,然后在创建一个文件夹存放静态资源文件。
    在这里插入图片描述
  • 运行容器,宿主机于容器的nginx文件数据共享,配置服务器的默认网关根目录位置
docker run -it -p 1010:1010 --name=staticNginx -v /home/data/nginx2:/etc/nginx  -v /home/data/nginx2data:/home/nginx   镜像ID

容器运行起来了:在这里插入图片描述

  • hosts 文件域名穿透
    在这里插入图片描述

  • 修改nginx2中nginx.conf与default.conf文件
    nginx.conf中不要配置upstream,因为nginx2只是用作静态资源服务器用,并非是代理服务器

    default.conf配置如下:
    在这里插入图片描述

  • 效果:docker中重启静态资源服务器,输入网址 http://static.hyf.com:1010/
    在这里插入图片描述


2、现在有web服务器两台tomcat1、tomcat2,静态资源服务器一台staticNginx,可以更改代理服务器myNginx的配置了
在这里插入图片描述

  • nginx.conf配置修改如下:
    在这里插入图片描述
  • default.conf配置修改如下:
    在这里插入图片描述
    注意:修改完成请在docker中重启该容器
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {    # 匹配所有以 gif,jpg或jpeg,xxxx结尾的请求
	proxy_pass http://static.hyf.com;
	}
	
	location ~ .*\.(js|css)?$ {         
	   proxy_pass http://static.hyf.com;
	}
	
	location ~ .*\.(html)?$ {
	   proxy_pass http://static.hyf.com;
	} 

http.server.localtion语法
基本语法: location [=|||^~]/uri/{…}
= 严格匹配, 如果这个查询匹配,将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~
不区分大小写匹配(可用正则表达式)
!~ 区分大小写匹配
!~* 不区分大小写匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式

3、修改tomcat1、tomcat2中的index.jsp,方便myNginx代理服务器的代理效果

  • 把下面代码复制到 tomcat/webapp/ROOT/index.jsp 文件中
<head>
        <title><%=request.getServletContext().getServerInfo() %></title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
		<link rel="stylesheet" href="http://static.hyf.com/static/css/common.css">
    <script src="http://static.hyf.com/static/js/common.js"></script>
    </head>

    <body>
	8080
      <img src="http://static.hyf.com/static/img/peien.jpg" alt="">
    </body>

在这里插入图片描述

另一个9090端口的也按此步骤修改(方便查看效果)

4、最终动静分离效果

在这里插入图片描述
在这里插入图片描述


大致的运行过程:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值