05- Nginx

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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

优点

1、可以高并发连接
官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。
原因,主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。

2、内存消耗少
Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。

​ 如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。

3、成本低廉
购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。
BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。

4、配置文件非常简单
网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。

5、支持Rewrite重写
能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。

6、内置的健康检查功能
如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。

7、节省带宽
支持GZIP压缩,可以添加浏览器本地缓存的Header头。

8、稳定性高
用于反向代理,宕机的概率微乎其微。

9、支持热部署
Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。

环境搭建

下载安装环境

pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

yum install -y pcre pcre-devel

c.zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

yum install -y zlib zlib-devel

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

yum install -y openssl openssl-devel

安装编译插件

yum -y install gcc-c++

上传 nginx 到 linux 系统

上传路径为 /usr/local/

解压缩, 并进入解压文件夹

配置安装路径

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(makeinstall)。

Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure–help输出详细的选项列表。

其中–prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。

如果配置–prefix,如:

# ./configure --prefix=/usr/local/test
此处为 
cd nginx-1.6.2
./configure --prefix=/usr/local/nginx

可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。
用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。

当然要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。

编译和安装

make && make install

安装成功

进入到安装目录

cd ..
cd nginx
ls 
# 显示为四个目录  conf  html  logs  sbin 

其中 启动命令为 sbin 中的 nginx 命令

启动

/usr/local/nginx/sbin/nginx

没有报错 就说明 安装成功

# 使用 进程命令, 验证是否安装成功
ps -ef | grep nginx

开放80端口号, 外网可访问

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/iptables status

编辑防火墙文件

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 82 -j ACCEPT

输入网址 可以直接访问

关闭命令 (-s stop)

/usr/local/nginx/sbin/nginx -s stop
推荐使用  -s quit
此方式停止步骤是待nginx进程处理任务完毕进行停止。从容关闭

重启命令

/usr/local/nginx/sbin/nginx -s reload

虚拟主机配置

修改配置文件

启动 nginx 之后,

查看 安装目录

(发现生成了很多目录)

ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

找到 conf 目录

cd conf
ls 
fastcgi.conf    fastcgi_params    koi-utf  mime.types   nginx.conf  
scgi_params       uwsgi_params          win-utf
fastcgi.conf.default  fastcgi_params.default  koi-win  mime.types.default  nginx.conf.default  scgi_params.default  uwsgi_params.default

核心配置文件为 (nginx.conf )

vim nginx.conf

nginx.conf配置文件

​ Nginx配置文件主要分成四部分:

main(全局设置) main部分设置的指令将影响其它所有部分的设置;
server(主机设置) server部分的指令主要用于指定虚拟主机域名、IP和端口;
upstream(上游服务器设置,主要为反向代理、负载均衡相关配置) upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
location(URL匹配特定位置后的设置) location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。

他们之间的关系式:server继承main,location继承server;

upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。

server虚拟主机

参考网址

https://www.cnblogs.com/connect/p/nginx-vhost.html

​ 虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。

​ 通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置,

1、基于ip的虚拟主机

如果是使用一台计算机测试需要为虚拟机添加ip

ifconfig ens33:1 192.168.204.151
ifconfig ens33:2 192.168.204.152

配置文件示例

server {
    listen 192.168.204.151:80;
    root /var/wwwroot/site1;
    index index.html;

    location / {
    }
}
server {
  listen 192.168.204.152:80;
  root /var/wwwroot/site2;
  index index.html;

  location / {
  }
}

2、基于域名的虚拟主机

如果是使用一台计算机测试需要修改 配置文件

(C:\Windows\System32\drivers\etc\ 修改hosts文件)

server {
    listen 80;
    server_name site1.test.com;
    root /var/wwwroot/site1;
    index index.html;

    location / {
    }
}
server {
  listen 80;
  server_name site2.test.com;
  root /var/wwwroot/site2;
  index index.html;

  location / {
  }
}

3、基于端口的虚拟主机

server {
    listen 8081;
    root /var/wwwroot/site1;
    index index.html;

    location / {
    }
}
server {
  listen 8082;
  root /var/wwwroot/site2;
  index index.html;

  location / {
  }
}

http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。

listen
监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。
server_name
服务器名,如localhost、www.example.com,可以通过正则匹配。

反向代理

正向代理

​ 正向代理就是我们平常使用的那种代理软件的效果,我们将自己的请求发给代理服务器,然后再由代理服务器发送给目标服务器;
客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器,而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。

在这里插入图片描述

反向代理

​ 反向代理,顾名思义,方向相反,当代理服务器收到请求后,依照某种规则,转发给不同的服务器。
从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。

反向代理环境配置

案例 两台虚拟机中的 两个tomcat服务通过nginx反向代理

向两台虚拟机中分别配置 Tomcat 服务器,并开启服务

分别标识出 两台虚拟机中的tomcat 页面 作出区分

默认配置

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #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;
        }

        # 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;
        #}
    }

修改添加为

server {
    listen 81;
    server_name  localhost;
    location / {
        #域名aaa.test.com的请求全部转发到tomcat_server1即tomcat1服务上
         proxy_pass http://192.168.3.163:8080;
        #欢迎页面,按照从左到右的顺序查找页面
         index index.jsp index.html index.htm;
    }
}
server {
    listen 82;
    server_name  localhost;
    location / {
		#域名bbb.test.com的请求全部转发到tomcat_server2即tomcat2服务上
         proxy_pass http://192.168.3.164:8080;
         index index.jsp index.html index.htm;
    }
}

测试使用端口的虚拟主机配置 (需要开启 nginx 服务器防火墙的的 81和82端口)

分别访问 
nginx :81 能够进入到 http://192.168.3.163:8080
nginx :82 能够进入到 http://192.168.3.164:8080

反向代理设置成功

动静分离测试

163 服务器下新建demo.jsp 页面

<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title><%=request.getServletContext().getServerInfo() %></title>
    <body>
    	<h1>192.168.3.163</h1>
    	<%
    		String addr = request.getRemoteAddr();
    		out.write("远程地址: "+addr);
    	 %>
    </body>
</html>

164 服务器下新建 demo.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
	<h1>192.168.3.164 html 静态页面</h1>
</body>
</html>

nginx 服务器环境设置

server {
    listen       80;
    server_name  localhost;
    # 当用户访问以.jsp 结尾的文件的时候, 跳转到 163 服务器
    location ~\.jsp$ {
    	proxy_pass http://192.168.3.163:8080;
        index index.jsp index.html index.htm;
    }
    # 当用户访问以.html 结尾的文件的时候, 跳转到 164 服务器
    location ~\.html$ {
    	proxy_pass http://192.168.3.164:8080;
        index index.html index.htm;
    }
}

含义为 ,

当用户访问以.jsp 结尾的文件的时候, 跳转到 163 服务器

当用户访问以.html 结尾的文件的时候, 跳转到 164 服务器

测试

String addr = request.getRemoteAddr();
获取请求对象的 ip地址 
测试得出结论 : 远程主机 , 并非客户机, 而是 nginx 主机, 
相当于 是nginx 服务器代理客户机进行访问

网址抽取

upstream tomcat_server1 {
    server 192.168.101.5:8080;
}
# 配置一个代理服务器
upstream tomcat_server2 {
    server 192.168.101.6:8080;
}

在之后的 localtion中

location ~\.html$ {
	# 使用外部配置的服务器地址
	proxy_pass http://tomcat_server1; 
    index index.html index.htm;
}

负载均衡

含义

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

当 用户量过多的时候, 一个tomcat 无法承载过多请求.
nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至 tomcat服务器。

案例实现

服务器环境

一个nginx 服务器 
192.168.3.126
两个tomcat 服务器 
192.168.3.163
192.168.3.164

当用户访问 nginx 的时候, 由nginx 负责切换不同的 tomcat 服务器,来处理用户请求

nginx.conf配置

upstream tomcat_server{
    server 192.168.3.163:8080 weight=1;
    server 192.168.3.164:8080 weight=1;
}
server {
    listen 80;
    server_name localhost;
    location / {
       proxy_pass http://tomcat_server;
       index index.jsp index.html index.htm;
    }
}

版本问题解决

报错如下
The character [_] is never valid in a domain name.
nginx配置文件中配置upstream时用了“_”字符,如上用的tomcat_server,直接报错了。
改成tomcatserver,即不使用“_”字符就好了。主要还是版本原因

负载均衡策略

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…

upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333 backup;  #热备     
    }

2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…

upstream mysvr { 
      server 127.0.0.1:7878;
      server 192.168.10.121:3333;       
    }

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…

 upstream mysvr { 
      server 127.0.0.1:7878 weight=1;
      server 192.168.10.121:3333 weight=2;
}

4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

upstream mysvr { 
  server 127.0.0.1:7878; 
  server 192.168.10.121:3333;
  ip_hash;
}

设备状态

down 表示单前的server暂时不参与负载
weight 权重,默认为1。 weight越大,负载的权重就越大。
max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout max_fails次失败后,暂停的时间。
backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

后续

使用keepalived+nginx 实现 负载均衡 + 高可用

keepalived

  keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
  Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

nginx是以多进程的方式来工作的。
nginx在启动后,会有一个master进程和多个worker进程
master进程主要用来管理worker进程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章