Nginx入门

一、Nginx 初探

1-1、什么是 Nginx?

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

  • 官方测试 nginx 能够支撑 5 万并发链接,并且 CPU、内存等资
    源消耗却非常低,运行非常稳定。

1-2、哪些地方使用了 Nginx

诸如百度、阿里云、腾讯云、爱奇艺、淘宝、天猫、京东、唯品会、优酷、乐视、土豆等商业巨头都有使用。淘宝根据自己的需求,对Nginx进行了自家的研发,搞出了Tnginx。

二、Nginx 纵深对比其优缺点

我们所熟知的一般是apache,为什么要学Nginx?

Nginx 和 apache 的优缺点:

  1. nginx 相对于 apache 的优点:

    轻量级,同样起 web 服务,比 apache 占用更少的内存及资源高并发,
    nginx 处理请求是异步非阻塞(如前端 ajax)的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能高度模块化的
    设计。

  2. apache 相对于 nginx 的优点:
    Rewrite 重写 ,比 nginx 的 rewrite 强大模块超多,基本想到的都
    可以找到少 bug ,nginx 的 bug 相对较多。(出身好起步高)

  3. Nginx 配置简洁, Apache 复杂

三、安装 Nginx

3-1、For Linux

注意Linux下的Nginx依赖 gccopenssl-devel pcre-develzlib-devel

3-1-1、安装依赖

  • 对于RedHat的CentOS系列
yum -y install gcc openssl-devel pcre-devel zlib-devel
  • 对于Deban系列
sudo apt-get install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev -y

3-1-2、下载Nginx

Nginx英文文档 | Nginx中文文档

Nginx下载页面

  • 选择1.8.1版本

  • wget http://nginx.org/download/nginx-1.8.1.tar.gz
    

不管是Windows还是Linux的下载下来都是一个压缩包。

3-1-3、解压文件

  • 解压文件(For Linux)

    tar -zxvf nginx-1.8.1.tar.gz 
    

3-1-4、configure 配置

解压完毕还不算完,我们需要对源码进行配置、编译、安装。Windows则可以直接使用。

  • 进入解压后的源码目录,

    cd nginx-1.8.1
    
  • 然后执行 configure 命令进行配置,指定安装目录

    ./configure --prefix=/usr/local/program/nginx
    
  • 编译、安装

    sudo make && make install
    

    如果报错:

    原因:将警告当成错误处理

    cc1: all warnings being treated as errors
    make[1]: *** [objs/Makefile:431:objs/src/core/ngx_murmurhash.o] 错误 1
    make[1]: 离开目录“/home/langkye/Downloads/chrome/nginx-1.8.1”
    make: *** [Makefile:8:build] 错误 2
    

    解决:编辑nginx解压目录下的objs/Makefile,将-Werror删除

    vim nginx1.8.1/objs/Makefile
    ### 将下面的-Werror删除
    # CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g
    

3-1-5、启动Nginx

  • 进入上面make install的nginx的sbin目录

    cd /usr/local/program/nginx/sbin
    
  • 启动

    ./nginx
    
  • 访问:http://localhost

    Nginx 默认监听 80 端口,看到如上页面信息,就安装成功了~

3-2、For Windows

3-2-1、下载Nginx

Nginx英文文档 | Nginx中文文档

Nginx下载页面

3-2-2、启动nginx

  • 进入nginx解压目录,双击运行nginx.exe

  • 访问:http://localhost

    Nginx 默认监听 80 端口,看到如上页面信息,就安装成功了~

3-3、Nginx命令

Nginx 默认监听 80 端口,一旦 nginx 启动,就可以通过调用带有-s 参数的可执行文件来控制它。

使用语法:nginx -s 信号

信号可以是下列之一:

  • stop: 快速关机
  • quit: 优雅的关机
  • reload:重新加载配置文件
  • reopen:重新打开日志文件

例如:要停止 nginx 进程并等待工作进程完成当前请求的服务,可以执行以下命令:

nginx -s quit

四、Nginx 配置

nginx的配置文件位于nginx安装目录/conf/下,我们所配置的文件为nginx.conf,为了防止被改坏,还提供了nginx.conf.default,如果我们该坏了,将其复制一份重命名为nginx.conf就好。

4-1、nginx 默认配置详解

  • nginx/conf/nginx.conf

    #进程数,建议设置和 CPU 个数一样或 2 倍
    worker_processes 2;
    
    #日志级别(默认 error 级别)
    error_log logs/error.log warning;
    
    # nginx 启动后的 pid 存放位置
    #pid logs/nginx.pid;
    
    events {
        #配置每个进程的连接数,总的连接数= worker_processes * worker_connections
        # 根据物理内存大小来配置,默认 1024
        worker_connections 10240;
    }
    
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        #连接超时时间,单位秒
        keepalive_timeout 65;
        
        server {
            #监听的端口号
            listen 80;        
            #监听的服务名
            server_name localhost
            
            #默认请求
            location / {
                root html; #定义服务器的默认网站根目录位置
    	      index index.php index.html index.htm; #定义首页索引文件的名称
    	  }
    		
    	      #定义错误提示页面
    	      error_page 500 502 503 504 /50x.html;
    		
    	      location = /50x.html {
    		  root html;
    	      }
    	}
    }
    

4-2、负债均衡配置

nginx 支持以下负载均衡机制(或方法):

  • 循环 - 对应用程序服务器的请求以循环方式分发
  • 最少连接数 - 将下一个请求分配给活动连接数最少的服务器
  • ip-hash - 哈希函数用于确定下一个请求(基于客户端的 IP地址)应该选择哪个服务器。

4-2-1、默认负载平衡配置

使用 nginx 进行负载平衡的最简单配置可能如下所示:

http {
    #相当于集群
    upstream shsxt{
        server srv1.example.com;
	server srv2.example.com;
	server srv3.example.com;
    }
    server {
	#监听http://localhost:80
	listen 80;
	server_name localhost;
	location / {
	    proxy_pass http://shsxt; #代理请求,根据算法交个上面的shsxt中的一个
	}
    }
}

在上面的示例中,在 srv1-srv3 上运行相同应用程序的 3 个实例。如果没有专门配置负载均衡方法,则默认为循环法。所有请求都被 代理到服务器组 shsxt,并且 nginx 应用 HTTP 负载平衡来分发请求。

4-2-2、加权负载平衡

通过使用服务器权重,还可以进一步影响 nginx 负载均衡算法,谁的权重越大,分发到的请求就越多。

关于权重,主要根据每个服务器的性能进行设定。默认权重为1

upstream shsxt {
    server srv1.example.com weight=3;
    server srv2.example.com;
    server srv3.example.com;
}

4-2-2、最少连接负载平衡

在连接负载最少的情况下,nginx 会尽量避免将过多的请求分发给繁忙的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务器过载。

upstream shsxt {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

4-2-4、 会话持久性

上述的循环或最少连接数的负载平衡方法,每个后续客户端的请求都可能被分发到不同的服务器。不能保证相同的客户端总是定向到相同的服务器。

如果需要将客户端绑定到特定的应用程序服务器 - 换句话说,就是始终选择相同的服务器而言,就要使客户端的会话“粘滞”或“持久” 。

ip-hash 负载平衡机制就是有这种特性。使用 ip-hash,客户端的 IP 地址将用作散列键,以确定应该为客户端的请求选择服务器组中的哪台服务器。此方法可确保来自同一客户端的请求将始终定向到同一台服务
器,除非此服务器不可用。

upstream shsxt{
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

4-3、Nginx 的访问控制

Nginx 还可以对 IP 的访问进行控制,allow 代表允许,deny 代表禁止.

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://shsxt;
}

从上到下的顺序,匹配到了便跳出。如上的例子先禁止了 192.168.78.1,接下来允许了 3 个网段,其中包含了一个 ipv6,最后未匹配的 IP 全部禁止访问.

五、虚拟主机

5-1、何为虚拟主机

虚拟主机是指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放和传输功能。

说白了虚拟主机就是把一台物理服务器划分成多个“虚拟”的服务器,各个虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台单独的主机的表现完全相同。

所以这种被虚拟化的逻辑主机被形象地称为“虚拟主机”。

  • 优点:
    由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。
    许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,网站服务器服务器管理简单,诸如软件配置、防病毒、防攻击等安全措施都由专业服务商提供,大大简化了服务器管理
    的复杂性;同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。
  • 类别:
    1. 基于域名的虚拟主机,通过域名来区分虚拟主机
    2. 基于端口的虚拟主机,通过端口来区分虚拟主机
    3. 基于 ip 的虚拟主机,很少用。

5-2、基于域名的虚拟主机

http {
    upstream shsxt{
        server srv1.example.com;
        server srv2.example.com;
    }
    upstream bjsxt{
        server srv3.example.com;
        server srv4.example.com;
    }
    server {
        listen 80;
        #访问 sxt1.com 的时候,会把请求导到 bjsxt 的服务器组里
        server_name sxt2.com;
        location / {
            proxy_pass http://bjsxt;
        }
    }
    server {
        listen 80;
        #访问 sxt2.com 的时候,会把请求导到 shsxt 的服务器组里
        server_name sxt1.com;
        location / {
            proxy_pass http://shsxt;
        }
    }
}

注意:基于域名的虚拟机主机 在模拟应用场景时,需要修该本机的域名映射。

  • windows 系统的 hosts文件里配置域名映射。(C:\Windows\System32\drivers\etc\hosts

  • Linux系统的域名映射表。(/etc/networks

如上图所示,将 sxt1 和 sxt2 的域名映射到 nginx 服务器 IP 上。此时访问http://sxt1.comhttp://sxt2.com的效果与访问http://localhost无疑异,都会走127.0.0.1

启动 nginx 后,分别访问: http://sxt1.com ,http://sxt2.com ,同样能走nginx。

5-3、基于端口的虚拟主机

http {
    upstream shsxt{
        server srv1.example.com;
        server srv2.example.com;
    }
    upstream bjsxt{
        server srv3.example.com;
        server srv4.example.com;
    }
    server {
        #当访问 nginx 的 80 端口时,将请求导给 bjsxt 组
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://bjsxt;
        }
    }
    server {
        #当访问 nginx 的 81 端口时,将请求导给 shsxt 组
        listen 81;
        server_name localhost;
        location / {
            proxy_pass http://shsxt;
        }
    }
}

六、正向代理和反向代理

正向代理

举个栗子:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

像我们经常通过 vpn 访问国外的网站,此时就是正向代理。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的 IP 地址,还有代理程序的端口。再比如FQ.

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了。www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。

Nginx 就是性能非常好的反向代理服务器,用来做负载均衡。

七、高并发 & 负载均衡

7-1、高并发(HA)

见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。简而言之就是每秒内有多少个请求同时访问。

7-2、负载均衡(LB)

负载均衡(Load Balance):将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。

八、Nginx的session的一致性问题

http 协议是无状态的,即你连续访问某个网页 100 次和访问 1次对服务器来说是没有区别对待的,因为它记不住你。

那么,在一些场合,确实需要服务器记住当前用户怎么办?

比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session 的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离 http 协议以及任何现有的 web 技术。

session 的常见实现形式是会话 cookie(session cookie),即未设置过期时间的 cookie,这个 cookie 的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。

8-1、Session 共享

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的 session 数据可能存在其中一台机器,这个时候
就会出现取不到 session 数据的情况,于是 session 的共享就成了一个问题

8-2、Session 一致性解决方案

  1. session 复制

    tomcat 本身带有复制 session 的功能。

  2. 共享 session

    需要专门管理 session 的软件:

    a). memcached 缓存服务,可以和 tomcat 整合,帮助 tomcat共享管理 session。

    b). redis缓存服务,可以和 tomcat 整合,帮助 tomcat共享管理 session。

8-3、安装 memcached

  1. 安装 memcached 内存数据库
yum –y install memcached

telnet localhost 11211测试,memcached服务是否启动。

  1. web 服务器连接 memcached 的 jar 包拷贝到 tomcat 的 lib。

  2. 配置 tomcat 的 conf 目录下的 context.xml

<Manager
         className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="n1:192.168.17.9:11211"
         sticky="true"
         lockingMode="auto"
         sessionBackupAsync="false"
         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
         sessionBackupTimeout="1000"
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

配置 memcachedNodes 属性,配置 memcached 数据库的 ip 和端口,默认 11211,多个的话用逗号隔开

目的?

让 tomcat 服务器从 memcached 缓存里面拿 session 或者是放 session

  1. 修改 index.jsp,取 sessionid 看一看
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html lang="en">
<head>
    <!-- ... -->
</head>
<body>
    SessionID:<%=session.getId()%>
    </br>
    SessionIP:<%=request.getServerName()%>
</body>
posted @ 2020-11-26 01:30  LANGKYE#  阅读(117)  评论(0编辑  收藏  举报