• linux中nginx的反向代理 负载均衡 多站点功能


    nginx学习

    需要装2个虚拟机

    nginx   官方nginx
    tenginx  淘宝nginx
    
    这2个一模一样,淘宝的nginx,官方文档更详细
    小提示: 如果你想删除 编译安装的软件  1,清空PATH  2,删除文件夹即可
    
    注意,编译软件之前,还是需要解决系统的开发环境,例如如下
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    
    
    1.进入淘宝nginx官网,下载源代码,进行编译安装
    http://tengine.taobao.org/index_cn.html
    
    2.在linux的opt目录下,下载nginx源代码
    wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
    
    3.解压缩源代码,准备编译三部曲
    [root@s25linux opt]# tar -zxvf  tengine-2.3.2.tar.gz
    
    4.进入源码目录,指定nginx的安装位置
    [root@s25linux tengine-2.3.2]# ./configure --prefix=/opt/tngx232/
    
    5.编译且编译安装,生成nginx的可执行命令目录
    make && make install 
    
    6.安装完毕后,会生成/opt/tngx232/文件夹,nginx可以使用的配置都在这里了
    [root@s25linux tngx232]# ls
    conf  html  logs  sbin
    
    conf  明显是存放*.conf配置文件的
    html  存放网页的静态文件的目录
    logs  日志
    sbin  存放nginx的可执行命令 
    
    
    7.添加nginx到PATH中,可以快捷执行命令
    
    永久修改PATH,开机就去读
    vim /etc/profile  
    写入PATH="/opt/tngx232/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
    
    8.首次启动nginx,注意要关闭防火墙
    直接输入nginx命令即可启动
    有关nginx的命令
    
    nginx						 #首次输入是直接启动,不得再次输入 
    nginx -s reload  #平滑重启,重新读取nginx的配置文件,而不重启进程
    nginx -s stop  	#停止nginx进程 
    nginx -t   #检测nginx.conf语法是否正确
    
    9.默认访问nginx的首页站点url是
    http://192.168.178.140:80/index.html
    

    nginx的配置文件学习

    nginx的配置文件是c语言的代码风格 
    
    以; 号 表示每一行配置的结束
    
    
    nginx.conf中 是以代码块形式 编写的
    
    例如 主要的几个代码块
    
    http{   }  #里面定义了多个代码,是nginx的核心功能配置点
    
    server{  }  #虚拟主机代码块,定义了网站的目录地址,以及首页文件名字,监听的端口,等等功能
    
    location {  }  #域名匹配代码块。。
    
    ####比喻代码块的含义
    def  hello():
    	 我是缩进,被hello这个函数 控制
    	 我们都是缩进内的代码块。。。
    	 
    	 
    func hello(){
    
    		我们都是在花括号内的代码。。
    		我们是各改代码块。。。。
    }	 
    
    

    image-20200219112719632

    课上的nginx.conf 注释如下

    #user  nobody;
    #  定义nginx的工作进程数,以cpu核数 为准
    worker_processes  5;
    # 想用哪个用能,直接打开注释,或者写进来即可
    error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    #error_log  "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";
    # pid文件的作用是,pid是用于启停进程的号码
    # ps -ef去获取nginx的进程id
    # 吧pid写入到 此 nginx.pid文件中,
    pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    # 这个http区域,是nginx的核心功能区域
    http {
        include       mime.types;
        default_type  application/octet-stream;
        #打开此nginx的访问日志功能,即可查看日志
        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  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
        #nginx开启静态资源压缩,比如nginx返回磁盘的html文件特别大,里面包含了诸多的js css,图片引用
        #  一个html文件 达到4m大小
        #  传输图片 等等都是高兴的 1080p图片
        #  打开此功能,能够极大的提升网站访问,以及静态资源压缩
        gzip  on;
    
        # 提供静态资源缓存功能,第一次访问过网页之后,nginx能够让图片js等静态资源,缓存到浏览器上
        # 浏览器下次访问网站,速度就几乎是秒开了
        # 想要用这些功能,只需要在nginx里打开某些配置即可,作者都已经写好了该功能
        #
        #这里的server区域配置,就是虚拟主机的核心配置
        # nginx支持编写多个server{} 区域块,以达到多虚拟主机,多个站点的功能
        #   server{} 区域块,可以存在多个,且默认是自上而下去加载,去匹配的
        #   目前这里是第一个server {} 区域块,端口是85
        server {
            # 定义该网站的端口
            listen       85;
            #填写域名,没有就默认即可
            server_name  localhost;
            #更改nginx的编码支持
            charset utf-8;
            # 如此添加一行参数,当用户请求出错,出现404的时候,就返回 root定义的目录去寻找40x.html文件
            # 讲师机器的配置,也就是去  /s25python/ 这个目录下 寻找 40x.html
            error_page  404  /40x.html;
            #access_log  logs/host.access.log  main;
            
            
           #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
            # nginx的域名匹配,所有的请求,都会进入到这里
            # 例如  192.168.178.140:85/lubenwei.jpg
            #    192.168.178.140:85/menggededianhua.txt
            location / {
                #这个root参数,是定义该虚拟主机,资料存放路径的,可以自由修改
                #  当用户访问  192.168.178.140:85的时候,就返回该目录的资料
                root   /s25python/;
               # index参数,用于定义nginx的首页文件名字  ,只要在/s25nginx目录下存在index.html文件即可
                index  index.html index.htm;
            }
    
        }
    
    #这里就是上一个Server{}的标签闭合处了,,可以写入第二个server{}
    # 注意 ,注意,server{} 标签快,是平级的关系,不得嵌套,检查好你的花括号
    # 这里是第二个虚拟主机的配置了
    server  {
    listen 89;
    server_name  _;
    #nginx的域名匹配
    # 当用户访问 192.168.178.140:89的时候,返回该目录的内容
    location  / {
            root   /s25linux/;
            index  index.html;
    
    }
    
    }
    }
    

    nginx的web站点功能

    也称之为是nginx的虚拟主机站点配置

    指的就是在nginx中,能够通过文件目录的不同,可以定义多个不同的网站

    修改nginx的首页内容,你们信不信我,一分钟做出一个dnf(腾讯的游戏官网)的官网~ 相信的扣1,觉得我在吹牛皮的,扣2  
    
    1.如何修改nginx的首页地址,进入html目录下,找到index.html文件,默认读取的是这个文件
    
    [root@s25linux html]# pwd
    /opt/tngx232/html
    [root@s25linux html]# ls
    50x.html  index.html
    
    2.在自己的站点下,存放一些静态资料,如gif,jpg等
    [root@s25linux html]# ls
    50x.html  55kai.jpg  index.html  s25.html
    

    image-20200219105934357

    nginx的多站点功能

    image-20200219112043819

    • 基于域名的多虚拟主机
    修改hosts文件,强制写入域名对应关系,比较麻烦
    
    • 基于端口的多虚拟主机
    1.修改nginx.conf配置如下,定义2个server{} 区域块即可
    

    第一个虚拟主机的配置

        #   目前这里是第一个server {} 区域块,端口是85
        server {
            # 定义该网站的端口
            listen       85;
            #填写域名,没有就默认即可
            server_name  localhost;
            #更改nginx的编码支持
            charset utf-8;
    
            #access_log  logs/host.access.log  main;
            #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
            # nginx的域名匹配,所有的请求,都会进入到这里
            # 例如  192.168.178.140:85/lubenwei.jpg
            #    192.168.178.140:85/menggededianhua.txt
            location / {
                #这个root参数,是定义该虚拟主机,资料存放路径的,可以自由修改
                #  当用户访问  192.168.178.140:85的时候,就返回该目录的资料
                root   /s25python/;
               # index参数,用于定义nginx的首页文件名字  ,只要在/s25nginx目录下存在index.html文件即可
                index  index.html index.htm;
            }
    
        }
    

    第二个虚拟主机的配置

    #这里就是上一个Server{}的标签闭合处了,,可以写入第二个server{}
    # 注意 ,注意,server{} 标签快,是平级的关系,不得嵌套,检查好你的花括号
    # 这里是第二个虚拟主机的配置了
    server  {
    listen 89;
    server_name  _;
    #nginx的域名匹配
    # 当用户访问 192.168.178.140:89的时候,返回该目录的内容
    location  / {
            root   /s25linux/;
            index  index.html;
    
    }
    
    }
    

    改完配置文件后,分别创建2个站点的资源目录

    [root@s25linux conf]#
    [root@s25linux conf]# mkdir /s25linux   /s25python
    [root@s25linux conf]#
    [root@s25linux conf]#
    [root@s25linux conf]# echo "i like linux ,i very  happy"  >  /s25linux/index.html
    [root@s25linux conf]#
    [root@s25linux conf]#
    [root@s25linux conf]# echo "i use python,i very  nb"  >  /s25python/index.html
    
    #注意,改了配置文件,一定要平滑重启,否则不生效
    
    [root@s25linux conf]# nginx  -s reload
    
    #此时分贝访问2个站点,即可看到2个站点的资料
    192.168.178.140:85
    192.168.178.140:85
    

    nginx的404页面优化

    如果nginx不做404优化,那么页面是非常丑的。。
    
    1.修改nginx.conf,修改一行参数即可
    
    server {
            # 定义该网站的端口
            listen       85;
            #填写域名,没有就默认即可
            server_name  localhost;
            #更改nginx的编码支持
            charset utf-8;
            # 如此添加一行参数,当用户请求出错,出现404的时候,就返回 root定义的目录去寻找40x.html文件
            # 讲师机器的配置,也就是去  /s25python/ 这个目录下 寻找 40x.html
            error_page  404  /40x.html;   #注意别忘了分号
            
            ......
            
            
    手动创建一个40x.html,咱们也可以去网上搜索404的html模板,修改此40x.html即可
    [root@s25linux conf]# cat /s25python/40x.html
    
    <meta charset=utf8>
    
    我是自定义的404页面,你看我美不美...
    
    注意还得重启nginx
    nginx -s reload  
    
    
    
    

    Nginx的访客日志

    nginx的方可日志,能够记录,分析用户的请求行为
    -什么时间点,访问的最频繁,比如路飞的网站,网站的流量,基本都在晚上,学生下了班,在线学习各种技术
    -记录用户的请求频率,以此检测是否是爬虫等恶意请求,进行封禁。
    -检测躲在代理ip后的 真实用户ip
    -检测用户ip,请求时间,请求的url内容,等等。。。。
    

    如何配置日志呢

    修改nginx.conf  在 http{}代码块中,打开如下注释即可
    
        #打开此nginx的访问日志功能,即可查看日志
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
       
       
    #如果25期所有学生,在班级,同时访问路飞官网
    # nginx日志检测到的ip地址是一样,还是不一样的?
    # 答案是一样的,因为大家都从同一路由器转发出去的公网
    # 我们都是通过同一个宽带运营商提供的公网ip和路飞通信的
    
        access_log  logs/access.log  main;
        
        
        日志变量解释
        $remote_addr    记录客户端ip
    $remote_user    远程用户,没有就是 “-”
    $time_local    对应[14/Aug/2018:18:46:52 +0800]
    $request     对应请求信息"GET /favicon.ico HTTP/1.1"
    $status      状态码
    $body_bytes_sent  571字节 请求体的大小
    $http_referer  对应“-”  由于是直接输入浏览器就是 -
    $http_user_agent  客户端身份信息,以此可以nginx判断,用户客户端是手机浏览器,就转发移动端页面给与用户
    如果是pc的客户端,就转发给pc页面给与用查看
    
    
    $http_x_forwarded_for  记录客户端的来源真实ip 97.64.34.118,机器A用机器B的ip去访问,可以抓出机器A的地址,这个参数不是万能的,爬虫和反扒是相互的。。。
    
    
    重启nginx -s reload 
    
    实时监测访客日志的信息
    

    nginx反向代理

    反向代理
    反向,代理
    
    代理是什么?你在生活中见过那些代理的事儿?
    如下的几种代理情况
    
    海外代购
    	我们再国内,想买的东西买不到,,------>  代购 ----->  国外的产品
    	我们拿到东西  <-------代理(人肉拿回来,寄回来)<-------国外的产品
    
    租房的中介
    
    你刚来北京,要住房 ,怎么办?
    
    找中介,支付中介费
    
    由于房东一般很难找到,或者说不想和客户直接打交道 
    
    超哥要租房 ------->  找到中介(只是做了一个中间人,租房请求转达给了房东) ------>房东(资源属于房东)
    超哥拿到房子的钥匙<------中介(拿到资源后,转发给用户)<-------房东
    
    
    直接找到房东本人的
    用户----> 房东
    用户<---房东
    
    
    
    
    买票,黄牛这个代理
    
    超哥想过年回家买票,,直接去12306买不着
    
    
    用户买票------>找黄牛----->拿到资源
    用户拿票<----黄牛<------某资源
    
    ---------
    在技术领域的反向代理
    
    
    
    

    image-20200219152059023

    image-20200219152430536

    正向代理,,代理服务器,代理的是客户端
    
    
    反向代理,,代理服务器,,代理的是服务端
    
    
    

    image-20200219152642108

    反向代理,实验配置

    讲道理,需要准备2台linux服务器
    
    192.168.178.134
    
    192.168.178.140
    

    image-20200219153041363

    考虑到咱们同学的笔记本,安装2个虚拟机会比较卡,
    因此决定用如下的方案,很巧妙,用到了nginx支持的多虚拟主机功能
    
    准备1台机器即可
    
    如192.168.178.140 ,基于端口的不同,运行不同的站点
    1.准备一台linux机器,安装好nginx之后,,修改nginx.conf如下,配置好2个server{}标签
    

    第一个server{}标签,用于反向代理的作用,修改nginx.conf如下

        #   第一个虚拟主机的配置,作用是反向代理了
        #
        server {
            listen       80;
            server_name  localhost;
            charset utf-8;
            error_page  404  /40x.html;
            # 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
            # 如果你写的是proxy_pass参数,就是一个请求转发,反向代理功能
            location / {
            #当请求发送给  192.168.178.140:80的时候
            #直接通过如下的参数,转发给90端口
            proxy_pass  http://192.168.178.140:90;
            }
    
        }
    

    第二个server{}标签,作用是返回机器上的资料,也就是一个web站点的功能

    #第二个虚拟主机,作用是web站点功能,资源服务器,提供页面的
    server  {
    listen 90;
    server_name  _;
    #当请求来到   192.168.178.140:90的时候,就返回/s25proxy目录下的index.html
    location  / {
            root   /s25proxy/;
            index  index.html;
    }
    
    }
    
    创建资源文件夹,以及html页面内容
    [root@s25linux conf]# cat /s25proxy/index.html
    <meta charset=utf8>
    
    我是资源服务器,我是192.168.178.140 的90端口
    
    重启nginx
    nginx -s reload
    

    测试访问代理服务器,查看页面效果

    反向代理对于项目部署的意义

    nginx负载均衡

    nginx负载均衡实验的搭建
    1.修改nginx.conf如下
    
    

    第一个虚拟主机server{}的作用,是反向代理,80端口

        # 用upstream关键词定义负载均衡池,写入资源服务器的地址
        # 负载均衡的算法,默认是轮询机制,一台服务器处理一次
        upstream  s25real_server  {
    server   192.168.178.140:90;
    server  192.168.178.140:95;
    }
        server {
            listen       80;
            server_name  localhost;
            charset utf-8;
            error_page  404  /40x.html;
            # 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
            # 如果你写的是proxy_pass参数,就是一个请求转发,反向代理功能
            location / {
            #当请求发送给  192.168.178.140:80的时候
            #直接通过如下的参数,转发给90端口
             proxy_pass  http://s25real_server;
            }
    
        }
    

    第二个server{}标签的配置,作用是提供资源给用户看的,90端口

    #第二个虚拟主机,作用是web站点功能,资源服务器,提供页面的
    server  {
    listen 90;
    server_name  _;
    #当请求来到   192.168.178.140:90的时候,就返回/s25proxy目录下的index.html
    location  / {
            root   /s25lol/;
            index  index.html;
    }
    
    }
    

    第三个server{}标签的作用,同样是返回资源页面,查看负载均衡效果的,95端口

    #第三个server{}虚拟主机,作用是 提供资源服务器的内容的
    server {
    listen 95;
    server_name _;
    location   /   {
    root  /s25dnf/;
    index  index.html;
    
    }
    }
    

    此时分别准备2个资源服务器的内容

    准备好 /s25lol/index.html
    准备好  /s25dnf/index.html
    

    最终访问效果如下

    image-20200219161842745

    负载均衡实验原理图

    image-20200219161031971

    nginx负载均衡算法

    1.默认是轮询机制,每台服务器处理一次
    2.加权轮询,修改nginx.conf如下,给与机器不同的权重
        upstream  s25real_server  {
    server   192.168.178.140:90 weight=4;
    server  192.168.178.140:95 weight=1;
    }
    
    

    image-20200219110747569

  • 相关阅读:
    在Windows Server 2008 R2上安装IIS服务
    Linux 系统化学习系列文章总目录(持续更新中)
    Oracle 11g一步步安装详解
    MySQL 菜鸟入门“秘籍”
    Linux下的/proc目录介绍
    Python查找文件
    Python对文件和文件路径的管理
    Python中执行外部命令
    Python处理命令行参数
    CentOS7--TigerVNC
  • 原文地址:https://www.cnblogs.com/zgboy/p/14680837.html
Copyright © 2020-2023  润新知