Nginx的真面目

目录

1.Nginx的基本介绍

2.应用场景

3.Nginx如何安装

4.Nginx配置文件结构

5.如何配置Web服务器

6.如何配置负载均衡

7.如何配置反向代理

8.请求转发和动静分离

9.Nginx的常用命令

10.写在最后


1.Nginx的基本介绍

    Nginx是一款由俄罗斯程序设计师Igor Sysocy开发的,基于C语言的轻量级的HTTP服务器(相比于Apache、Lighttpd而言),同时也可以用作反向代理、负载平衡器 和 HTTP缓存。

   其特点是占有内存少,并发能力强,能够支持高达50000个并发连接响应。这归功于它选择了epoll and kqueue作为开发模型,该开发模型socket数量不限制,而Apache采用的是 select 开发模型。它处理请求是异步非阻塞,在高并发下保持低资源低消耗高性能。非常稳定,bug极少。Apache使用处理每个连接都需要一个进程,其并发性能不是很好。而Nginx使用多路复用的技术,让一个进程处理多个连接,所以并发性能比较好。可以说构建大型网站无一例外都是使用nginx,电商、互联网架构大部分都采用Nginx+Tomcat的架构,如:新浪、网易、腾讯、京东、淘宝等。

综上所述,有如下几个特点:

  • Nginx是一个高性能的HTTP和反向代理服务器
  • 采用C语言编写
  • 支持的操作系统众多,windows、linux、MacOS X
  • 安全性高,外界只能访问nginx所在服务器,nginx将请求转发内部服务器。调用后,返回调用的结果
  • 可实现负载均衡
  • Rewrite功能强大

Nginx与Apache优缺点比较:

优点:

  1. 静态处理性能比 Apache 高三倍以上
  2. Nginx 配置简洁,而且改完配置能使用 -t 测试配置有没有问题,Apache 配置复杂 
  3. 负载能力比 Apache 高很多。Nginx 以 epoll  and kqueue 作为开发模型,处理请求是异步非阻塞的,而 Apache 则是阻塞型
  4. 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源

缺点:

  1. Apache 在处理动态请求有优势,Nginx 适合静态和反向
  2. Apache 的 rewrite 比 Nginx 强大
  3. Nginx 的 bug 相对较多,Apache较稳定
  4. Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端

2.应用场景

  • HTTP服务器:Nginx是一个HTTP服务可以独立提供HTTP服务。既可以做网页静态服务器,又可以支持PHP提供的服务器端业务。
  • 虚拟主机:可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟主机。
  • 反向代理、负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用Nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

反向代理VS正向代理:

  • 正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】,在现实中的例子就是『』,通过代理服务器去访问真实想访问的,代理服务器为一堆客户做代理;目标服务器不知道真实的客户端是谁。
  • 反向代理,用户去访问的时候,不知道真正访问的是哪一台服务器,就跟打10086一样,只管拨通10086,不管那边是哪个服务人员;为服务器做代理

3.Nginx如何安装

  • Linux环境下Nginx的安装
  • Windows环境下Nginx的安装
  • Mac os环境下Nginx的安装

4.Nginx配置文件结构

以Mac系统为例,Nginx的配置文件分为一下几个模块:

  • 全局作用域块
  • event 作用域块
  • http 指令作用域块
  • server 指令作用域块
  • location 指令作用域块

Nginx的真面目_第1张图片

(图片来源于网络)

获取各参数具体的配置规则,请点击改文章的 1.4 Nginx优化 部分

获取如何打开配置文件,请参考 Nginx的常用命令 部分。

5.如何配置Web服务器

  • 配置静态HTTP服务:
server {  
    listen80; # 端口号  
    location / {  
        root /usr/share/nginx/html; # 静态文件路径  
    }  
} 
  • 配置动态PHP服务:

需要先行安装PHP的版本,然后使得Nginx可以支持PHP,具体安装过程请参考 配置Nginx来支持php

然后配置Nginx的项目目录等:

server {  
    listen80; # 端口号  
    location ~ \.php$ {
                        root /var/www; #指定php的根目录
                        fastcgi_pass 127.0.0.1;#php-fpm的默认端口是80
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME         
                        $document_root$fastcgi_script_name;
                        include fastcgi_params;
                }
} 

6.如何配置负载均衡

(图片来源网络)

1、轮询:默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}
 
server {  
    listen80;  
    location / {  
        proxy_pass http://fengzp.com;  
    }  
} 

 2、最少连接:把请求分配到连接数最少的server

upstream  fengzp.com {   
    least_conn;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

 3、权重:使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍

upstream  fengzp.com {   
    server   192.168.99.100:42000 weight=1; 
    server   192.168.99.100:42001 weight=2;  
}

 4、ip_hash:每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除 ;ip_hash可以和weight结合使用

upstream  fengzp.com {   
    ip_hash;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

LVS、HAProxy、Nginx负载均衡比较:

LVS:

  1.  工作在网络4层,通过vrrp协议转发(仅作分发之用),不产生流量,具体的流量由linux内核处理
  2. 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
  3. 应用范围比较广,可以对所有应用做负载均衡;
  4. 配置复杂,对网络依赖比较大
  5. 抗负载能力强。能达到F5硬件的60%;对内存和cpu资源消耗比较低
  6. 不支持虚拟主机
  7. 不支持正则处理,不能做动静分离。

Ngnix:

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构
  2. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、lc(最少连接)、Ip-hash(Ip哈希)
  3. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
  4. 配置简单,Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
  5. 抗负载相对lvs弱些
  6. 支持虚拟主机
  7. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
  8. 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好
  9. Nginx还能做Web服务器Cache功能。

HAProxy的特点是:

  1. 支持两种代理模式:TCP(四层)和HTTP(七层)
  2. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  3. 支持虚拟主机
  4. 支持Session的保持,Cookie的引导等工作
  5. 支持url检测后端服务器健康检测。
  6. 不能做Web服务器Cache。
  7. 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,支持对Mysql进行负载均衡,对后端的DB节点进行检测

7.如何配置反向代理

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

优点:反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

与正向代理服务器区别:在于正向代理代理的是客户端,反向代理代理的是服务端,正向代理能过帮助客户端访问不了服务端实现访问,客户端必须要进行一些特别的设置才能使用正向代理

   

   为什么要反向代理?作用服务端的代理,自然就是一台服务器处理不过来了,需要转发、分散请求给其他服务器做。下面罗列些适用场景:

  • 负载均衡:上面例子中的web1和web2使用了nginx的负载均衡技术,把请求转向一组服务器。具体转发到哪个服务器,nginx提供了多种负载策略,例子中使用的是加权重的方式,web1 upstream是2个请求中,1个请求给111服务器,1个给222服务器。关于跟多的负载均衡的策略,请参看nginx官方文档-负载均衡

  • 一个域名,多个网站:在这里反向代理倒不是为了负责存在,而是为了域名和服务的统一部署。例如一个公司的内部网站需要搭建很多服务——代码管理服、wiki服务、oa……,但是只要一个域名。这时候就可以用反向代理把不同的子域名转发到不同的服务上。下面是一个例子:

  • 当然反向代理的另一大用处就是隐藏后面的实际服务,以此来达到一定的安全性。

server {  
    listen80;  
    location / {  
        proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址  
    }  
} 

具体如何配置,请参考:Nginx反向代理配置

举例:如下配置,访问tomcat.taotao.com时,分别轮流的访问8080和8081两个Tomcat,配置Tomcat集群:

upstream tomcats{

server 192.168.25.148:8080;

server 192.168.25.148:8081;

}

server {

listen 80;

server_name tomcat.taotao.com;

location / {

proxy_pass http://tomcats;

index index.html index.htm;

}

}

Nginx配置负载均衡

如下,upstream的server后面添加一个weight即可代表权重。权重越高,分配请求的数量就越多。默认权重是1

upstream tomcats{

server 192.168.25.148:8080 weight=2;

server 192.168.25.148:8081;

}

server {

listen 80;

server_name tomcat.taotao.com;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://tomcats;

index index.html index.htm;

}

}

8.请求转发和动静分离

  • 请求转发:当用户访问 http://localhost:80,Nginx 将这个请求什么也不做,只负责转发到 tomcat 的访问地址 http://localhost:8080,这方面用途可以参考本人写的另外一篇:Apache配置多站点域名访问,并反向代理到Tomcat项目这篇文章
server {
	listen       80;
	server_name  localhost;
 
	location / {                                #拦截所有的资源
		proxy_pass   http://127.0.0.1:8080;     #转向tomcat的地址
	}	
}
  • 动静分离:

静态资源:图片、css、js、html(静态资源处理时并发非常高)

动态资源:asp/aspx、php、jsp

location / {
	#相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下
	root   html; 
	#配置的欢迎页面
	index  index.html index.htm;		
}

   传统将JavaEE项目是把资源一起放到war中,而动静分离是把静态资源从war中剥离出来,单独放在一个目录中。这样当访问静态资源时,就由nginx直接重定向文件资源。当访问动态资源就由Tomcat解析。Nginx解析静态比Tomcat快很多。

9.Nginx的常用命令

1.Nginx 安装及配置查询:

find / -name 'nginx' 

2.Nginx常用命令:

进入nginx安装目录:cd /usr/local/sbin/

执行启动命令:./ nginx

停止nginx ./sbin/nginx -s stop    ./sbin/nginx -s quit

重载配置  ./sbin/nginx -s reload(平滑重启)  service nginx reload 

重载指定配置文件 ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看nginx版本 ./sbin/nginx -v

检查配置文件是否正确 ./sbin/nginx -t

显示帮助信息 ./sbin/nginx -h

3.查看Nginx的进程号:

ps auxp | grep nginx

4.Nginx的信号量:

TERM    快速终止(Quick shutdown)
INT     快速终止(Quick shutdown)
QUIT    优雅的关闭进程,即等请求结束后再关闭(Graceful shutdown)
HUP     改变配置文件,平滑的重读配置文件
USER1   重读日志归档备份
USER2   平滑升级
WINCH   优雅的关闭

10.写在最后

本文是题主转载与几位博主的文章,再次题主将其再次写出来为了便于查看,另外一方面也会在后来做该方面工作的时候可以继续去补充,希望能和大家共勉,一起去贡献出更精彩的博客!

注:文章转载列表:

1.Nginx总结

2.Nginx总结

3.Nginx(总结整理)

4.Nginx总结

5.维基百科

6.Nginx反向代理配置


题主只是一个入门的小学生,希望大家多多指教!如果该帖子确实能解决您的问题,望多多留言,谢谢!


 

你可能感兴趣的:(服务器运维,服务器部署与配置,Nginx,反向代理,负载均衡)