• nginx技术


    Nginx

    处理高并发,单台服务器存在服务瓶颈

    Nginx属于nio ,noblocking Io非阻塞式的

    Apache属于Bio,Blocking IO 阻塞式的

    安装部分

    • 依赖安装:yum -y install gcc openssl-devel pcre-devel zlib-devel -y

    • 解压源码 tar -zxvf nginx-1.8.1.tar.gz

    • 在源码目录下运行配置文件configure并指定安装目录

      cd nginx-1.8.1

      ./configure --prefix=/opt/sxt/nginx

    • 在源码目录下编译安装

      make && make install

    命令部分

    在软件目录/opt/sxt/nginx/sbin中执行nginx

    • 启动 ./nginx

    • 快速关闭 ./nginx -s stop

    • 普通关闭 ./nginx -s quit

    • 重载配置文件 ./nginx -s reload (在启动状态下使用,立即生效)

    • 重新打开日志文件 ./nginx -s reopen

    启动后访问端口默认: 192.168.163.10:80

    关于直接访问nginx页面

    在软件的html目录下,加载html页面与其他静态资源(图片等),该目录为网页直接访问nginx的文件的根目录。http://node2/123.jpg

    配置部分

    文件路径:opt/sxt/nginx/conf/nginx.conf (只需要配置主节点,其他节点启动tomcat作为服务节点)

    全局配置

    • worker_processes 运行进程数 ,一般与cpu核数一致

    • error_log日志的路径和格式类型

    • pid 当前进程存放的位置

    #user  nobody;  用户运行nginx
    worker_processes 1;
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;
    #pid       logs/nginx.pid;

    event配置(线程数)

    worker_connections用于配置每个进程的线程数

    events {
      worker_connections 1024;
    }

    http(网络信息)

    • include 接收的请求资源的类型的配置文件

    • default_type 数据发送的方式

    • log_format日志格式 并定义了main的格式名称 ,可以自定义sxt的日志格式

    • access_log访问日志的路径及格式(格式引用log_format)

    • sendfile 基于内核的数据拷贝方式,减少拷贝的内存占用

    • tcp_nopush 是否关闭争抢方式服务,可能造成惊群效应

    • keepalive_timeout保持与浏览器服务的长链接时间,一个链接实现多次请求

      可以设置为0,使得连接切换明显,便于测试

    • gzip 文件是否以压缩方式发送

    • server配置虚拟主机

    • upstream配置代理集群

    http {
      include       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"';
      #log_format sxt '$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;
      #gzip on;
    upstream
      server {...}
      }

    upstream 集群配置

    server配置集群的各主机及端口;

    集群默认使用轮询的方式调用节点

    每个节点后可加入weight权重,值越大分配越多

    least_conn属性 实现最少连接负载平衡,用于将请求分配到最少连接节点上

    ip_hash属性 用于确保同一客户端的请求只定向到一台服务器上(除非不可用),实现会话持久性

    upstream xxx{
    least_conn;
    server 192.168.163.11:8080 weight=3;
    server 192.168.163.12:8080;
    server 192.168.163.13:8080;
    }
    #注意结尾的分号

    server(虚拟主机)

    server位于http中,可以写多个service

    虚拟主机:一般都是基于域名(server_name)和端口(listen )区分虚拟主机,可以基于ip。nginx根据请求的域名和端口分配不同的server虚拟主机,执行对应的服务。

    • listen为nginx监听的端口

    • server_name为监听的主机名或IP,可以设置多个空格分隔

    • location 拦截uri及代理配置

    • charset字符集

    • access_log 针对当前主机的访问日志及格式

    • error_page 错误页面(了解)

    • proxy代理php相关内容...(了解)

    server {
          listen       80;
          server_name basenode;
          location / {
              root   html;
              index index.html index.htm;
          }
          #charset koi8-r;
          #access_log logs/host.access.log main;
          #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   html; }
    }
    以下基于ssl的是https的代理
    server {
      #   listen       443 ssl;
      #   server_name localhost;

      #   ssl_certificate     cert.pem;
      #   ssl_certificate_key cert.key;

      #   ssl_session_cache   shared:SSL:1m;
      #   ssl_session_timeout 5m;

      #   ssl_ciphers HIGH:!aNULL:!MD5;
      #   ssl_prefer_server_ciphers on;

      #   location / {
      #       root   html;
      #       index index.html index.htm;
      #   }
      #}

    location(拦截与分配)

    位于server中,用于拦截请求并指定代理服务器

    • proxy_pass定义所代理的服务器或集群,注意结尾加分号

    • root为根目录,index为默认的访问地址(了解)

    • 内部加载访问控制allow与deny

    系统默认的nginx主页地址
    location / {
    root   html;
    index index.html index.htm; }

    通过代理实现服务器的代理
    location / {
    proxy_pass http://192.163.163.11:8080;
    }    
    通过代理实现服务器集群的代理
    location / {
    proxy_pass http://upstream的集群名;
    }    
    location / {
      allow 192.168.78.0/24;
      deny 192.168.78.1;
      allow 10.1.1.0/16;
      allow 192.168.1.0/32;
      deny all;
    proxy_pass http://xxx:8080;
    }  

    关于拦截(资源静态化)

    格式:location 规则 正则表达式 { }

    规则包括
    • = 开头表示精确匹配

    • ^~ 开头表示uri以某个指定字符串开头

    • ~ 开头表示区分大小写的正则匹配

    • ~* 开头表示不区分大小写的正则匹配

    • ! 取反

    • / 通用匹配,任何请求都会匹配到

    • 主要涉及

      • ^~ /static/ 指定静态资源

      • ~ .(gif|jpg|png|js|css)$指定后缀结尾

      • ~* .png$ 指定某一类文件后缀


    location = / {
      #规则A
    }
    location = /login {
      #规则B
    }
    location ^~ /static/ {
      #规则C
    }
    location ~ .(gif|jpg|png|js|css)$ {
      #规则D
    }
    location ~* .png$ {
      #规则E
    }
    location !~ .xhtml$ {
      #规则F
    }
    location !~* .xhtml$ {
      #规则G
    }
    location / {
      #规则H
    }

    Tips:

    静态资源服务器
    • 将静态资源直接放在nginx上的示例,也可以配置专门的服务器执行静态资源的服务。

    #使得www.123.com/static/xxxx 的静态资源请求直接到nginx服务中的statices文件夹获取。#statices文件夹创建路径在/opt/sxt/nginx/statices
    server{
    listen   80;
    server_name www.123.com;
    location ^~ /static/ {
    alias statices/;
    }
    location / {
    proxy_pass http://192.168.163.11:8080;
    }
    }
    • 可以将静态资源配置到其他域名中。

    #www.123.com的页面中可以请求www.456.com/static/xxxx的静态资源呢,资源的存放路径同上
    server{
    	listen   80;
    	server_name www.123.com;
    	location / {
    		proxy_pass http://192.168.163.11:8080;
    	}
    }
    server{
    	listen   80;
    	server_name www.456.com;
    	location ^~ /static/ {
    		alias statices/;
    	}
    }
    
    server{
    	listen   80;
    	server_name www.123.com;
    	location ^~ /static/ {
    		proxy_pass http://192.168.163.11:8080;#指向静态资源所在的tomcat
    	}
    }
    

    关于访问控制

    • allow允许访问,deny拒绝访问

    • 从上往下依次判断,找到第一个匹配的判断条件后,不再执行后面的条件判断。

    • all表示全部请求匹配

    • 注意这里是针对客户端的ip及访问端口的范围限制(192.168.78.0/24)

    allow 192.168.78.0/24;
    deny 192.168.78.1;
    allow 10.1.1.0/16;
    allow 192.168.1.0/32;
    deny all;
    

    关于测试

    使用各节点的tomcat进行测试:监听各节点的8080端口

    使用tomcat主页进行访问,需要对主页进行修改:

    • 主页路径 /opt/sxt/apache-tomcat-7.0.61/webapps/ROOT/index.jsp

    • 将主页修改为以下代码,使得网页显示当前访问的节点和session连接编号

    <h1>xxx节点<h1>
    <%=session.getId() %>  
    

    在访问控制中本地主机的ip是子网前三位+.1,也就是192.168.163.1

    正向代理与反向代理

    • 正向代理为客户工作,

      • 需要知道代理地址与目标地址

      • 通过代理访问目标地址

    • 反向代理为服务器工作

      • 只需要知道反向代理地址,不需要指定特定服务器

      • 反向代理配置了规则,通过规则将请求指向对应的服务器

    Session一致性问题

    由于集群并非单台服务器,需要保证客户访问session在集群中的一致

    解决方式

    1 session复制 tomcat自带功能(了解)

    2 配置管理软件处理,整合tomcat,将session存数据库

    memcached方案

    yum install memcached -y

    service memcached start

    chkconfig memcached on(可选)

    telnet localhost 11211 检查是否启动 quit退出 (session共享服务器的端口为11211 )

    将memcached的依赖包复制到需要session共享的各tomcat服务器中,路径为/opt/sxt/apache-tomcat-7.0.61/lib

    修改tomcat服务器的配置文件,/opt/sxt/apache-tomcat-7.0.61/conf/context.xml

    #注意修改memcachedNodes也就是session共享服务器,也就是memcached所安装的服务器ip:11211
    <Manager 
    className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.163.10:11211"
    sticky="true"
    lockingMode="auto"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
    sessionBackupTimeout="1000" 
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
    />
    

    重启tomcat :./shutdown.sh ./startup.sh

    上述配置值使用于同一个server集群中共享

    跨域解决方案(待研究)

    domain设置

    location / {
    proxy_cookie_domain b.com a.com;
    proxy_pass http://b.com;
    }
    

    使得b.com的cookice存到a.com页面中(session随着cookie迁移)

    参考https://blog.csdn.net/u013314786/article/details/84584374

    http://www.nginx.cn/doc/

    https://www.cnblogs.com/kevingrace/p/5707750.html

  • 相关阅读:
    采样定理
    空间谱专题03:时空特性与采样定理
    常见的矩阵形式
    【Windows】XShell中使用小键盘和ALT键(作Meta键),使BackSpace正常
    【Linux】Ubuntu13.10搭建gitlab报错信息及解决
    〖Android〗ant build android project, setting android.jar precedence
    〖Linux〗使用命令行切换触摸板的状态on/off/toggle
    【Android】ant编译aidl的错误
    【Android】源码external/目录中在编译过程中生成的文件列表
    〖Linux〗实时更新 hosts 文件的脚本
  • 原文地址:https://www.cnblogs.com/javaxiaobu/p/11702993.html
Copyright © 2020-2023  润新知