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

nginx技术的更多相关文章

  1. Nginx技术进阶详讲

    Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...

  2. Nginx技术研究系列5-动态路由升级版

    前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...

  3. Nginx技术研究系列3-OpenResty安装配置

    上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...

  4. Nginx技术研究系列6-配置详解

    前两篇文章介绍了Nginx反向代理和动态路由: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 随着研究的深入,很重要的一点就是了解 ...

  5. Nginx技术研究系列2-基于Redis实现动态路由

    上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...

  6. Nginx技术研究系列4-Nginx监控-Nginx+Telegraf+Influxb+Grafana

    搭建了Nginx集群后,需要继续深入研究的就是日常Nginx监控. Nginx如何监控?相信百度就可以找到:nginx-status 通过Nginx-status,实时获取到Nginx监控数据后,如何 ...

  7. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计

    前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...

  8. Nginx技术研究系列1-通过应用场景看Nginx的反向代理

    随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名. 这么多的WebApi站点这么多的域名,管理和维护成本很 ...

  9. nginx技术分享 (转)

    原文地址:http://blog.csdn.net/nethibernate/article/details/6628267 Nginx的作用: HTTP Server 反向代理,用于将用户的请求转发 ...

  10. Nginx技术深入剖析

    Nginx软件功能模块说明 核心功能模块(Core functionality):主要对应配置文件的Main区块和Events区块. 标准的http功能模块: 企业 场景常用的Nginx http功能 ...

随机推荐

  1. 在Linux实例上自动安装并运行VNC Server

    #!/bin/bash ######################################### #Function: install vnc server #Usage: bash ins ...

  2. Cesium动态绘制实体(点、标注、面、线、圆、矩形)

    //自定义绘制图形,支持 点,线,面,矩形,圆,标识,可自定义绘制过程中的和绘制完的预览 this.drawGraphic = function(view,_mode,_callback,_Graph ...

  3. 「Flink」事件时间与水印

    我们先来以滚动时间窗口为例,来看一下窗口的几个时间参数与Flink流处理系统时间特性的关系. 获取窗口开始时间Flink源代码 获取窗口的开始时间为以下代码: org.apache.flink.str ...

  4. Python——模块和包

    一.概念 """模块():一个python文件,以 .py 结尾,包含python对象定义和语句.模块可以定义函数.类.变量,也可包含可执行文件 导入模块: 1.impo ...

  5. 二、Nginx配置实例

    Nginx配置实例 一.反向代理 实例一 1.实现效果 打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到linux系统tomcat主页面中. 2.准备工作 在linux系统中安装t ...

  6. Winfrom中From控件的重绘

    重绘目的: 1. 满足非默认主题下的标题栏样式 2. 在保留停靠功能的同时进行重绘. 代码如下: public partial class FormEx: Form { public FormEx() ...

  7. C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换

    本篇博客园是被任务所逼,而已有的使用nopi技术的文档技术经验又不支持我需要的应对各种复杂需求的苛刻要求,只能自己造轮子封装了,由于需要应对很多总类型的数据采集需求,因此有了本篇博客的代码封装,下面一 ...

  8. MongoDB3.4版本新增特性

    先说明一下mongod和mongos的含义:mongod是MongoDB系统的主要后台进程,它处理数据请求.管理数据访问和执行后台管理操作:该命令的命令行选项主要用于测试,在场景操作中,使用配置文件选 ...

  9. cf912D

    题意简述:往n*m的网格中放k条鱼,一个网格最多放一条鱼,然后用一个r*r的网随机去捞鱼,问怎么怎么放鱼能使得捞鱼的期望最大,输出这个期望 题解:肯定优先往中间放,这里k不大,因此有别的简单方法,否则 ...

  10. beego orm的使用

    在使用beego model 去操作数据库时 有一些疑惑  找到了一个比较好的博文 原文地址 : https://my.oschina.net/u/252343/blog/829912 (Kelvin ...