目录
1.Nginx的基本介绍
2.应用场景
3.Nginx如何安装
4.Nginx配置文件结构
5.如何配置Web服务器
6.如何配置负载均衡
7.如何配置反向代理
8.请求转发和动静分离
9.Nginx的常用命令
10.写在最后
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优缺点比较:
优点:
- 静态处理性能比 Apache 高三倍以上
- Nginx 配置简洁,而且改完配置能使用 -t 测试配置有没有问题,Apache 配置复杂
- 负载能力比 Apache 高很多。Nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,而 Apache 则是阻塞型
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
缺点:
- Apache 在处理动态请求有优势,Nginx 适合静态和反向
- Apache 的 rewrite 比 Nginx 强大
- Nginx 的 bug 相对较多,Apache较稳定
- Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端
- HTTP服务器:Nginx是一个HTTP服务可以独立提供HTTP服务。既可以做网页静态服务器,又可以支持PHP提供的服务器端业务。
- 虚拟主机:可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟主机。
- 反向代理、负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用Nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
反向代理VS正向代理:
- 正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】,在现实中的例子就是『』,通过代理服务器去访问真实想访问的,代理服务器为一堆客户做代理;目标服务器不知道真实的客户端是谁。
- 反向代理,用户去访问的时候,不知道真正访问的是哪一台服务器,就跟打10086一样,只管拨通10086,不管那边是哪个服务人员;为服务器做代理;
以Mac系统为例,Nginx的配置文件分为一下几个模块:
- 全局作用域块
- event 作用域块
- http 指令作用域块
- server 指令作用域块
- location 指令作用域块
(图片来源于网络)
获取各参数具体的配置规则,请点击改文章的 1.4 Nginx优化 部分
获取如何打开配置文件,请参考 Nginx的常用命令 部分。
server {
listen80; # 端口号
location / {
root /usr/share/nginx/html; # 静态文件路径
}
}
需要先行安装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;
}
}
(图片来源网络)
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:
- 工作在网络4层,通过vrrp协议转发(仅作分发之用),不产生流量,具体的流量由linux内核处理
- 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
- 应用范围比较广,可以对所有应用做负载均衡;
- 配置复杂,对网络依赖比较大
- 抗负载能力强。能达到F5硬件的60%;对内存和cpu资源消耗比较低
- 不支持虚拟主机
- 不支持正则处理,不能做动静分离。
Ngnix:
- 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构
- 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、lc(最少连接)、Ip-hash(Ip哈希)
- Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
- 配置简单,Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
- 抗负载相对lvs弱些
- 支持虚拟主机
- 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
- 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好
- Nginx还能做Web服务器Cache功能。
HAProxy的特点是:
- 支持两种代理模式:TCP(四层)和HTTP(七层)
- 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
- 支持虚拟主机
- 支持Session的保持,Cookie的引导等工作
- 支持url检测后端服务器健康检测。
- 不能做Web服务器Cache。
- 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,支持对Mysql进行负载均衡,对后端的DB节点进行检测
概念:以代理服务器来接受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;
}
}
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快很多。
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 优雅的关闭
本文是题主转载与几位博主的文章,再次题主将其再次写出来为了便于查看,另外一方面也会在后来做该方面工作的时候可以继续去补充,希望能和大家共勉,一起去贡献出更精彩的博客!
注:文章转载列表:
1.Nginx总结
2.Nginx总结
3.Nginx(总结整理)
4.Nginx总结
5.维基百科
6.Nginx反向代理配置
题主只是一个入门的小学生,希望大家多多指教!如果该帖子确实能解决您的问题,望多多留言,谢谢!