一:首先,这个东西是老毛子开发的!所以名字看起来很怪异,至少我是这么觉得。
第一个公开版本0.1.0发布于2004年10月4日!
二:Nginx是个撒
百度百科给出的定义:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好(据说可达到5W并发量),中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
三:主要应用场景
1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
四:Nginx安装比较简单,不在阐述。
注意两点:
1、由于是C语言开发的,因此首先必须安装gcc编译环境,即yum install gcc-c++
2、因为nginx还依赖第三方开发包,因此在编译之前需要安装好第三方开发包(如果不安装第三方开发包编译的时候会报错)
五、具体应用:
1.作为http服务器,比较简单不在阐述。
2、配置虚拟主机
2.1、虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。
2.2、Nginx支持三种类型的虚拟主机配置,a、基于ip的虚拟主机, b、基于域名的虚拟主机 c、基于端口的虚拟主机
2.3通过端口区分不同的虚拟主机:
可以配置多个server,配置了多个虚拟主机。每个server就是一个虚拟主机。
完事之后刷新配置文件
2.3、通过域名区分不同的虚拟主机:
本地测试可以修改hosts文件,修改window的hosts文件:(C:\Windows\System32\drivers\etc)
使用SwitchHosts来改变hosts文件。
SwitchHosts-logo
今天看见SwitchHosts的这个logo总是能想起瑞士球风,马儿一场比赛下来衣服由XL恐怕变成了XXL!
Nginx的配置:
修改/usr/local/nginx/conf/nginx.conf文件,添加两个虚拟主机,如下:
#配置虚拟主机www.jd.com
server {
#监听的ip和端口,配置本机ip和端口
listen 124.127.99.32:80;
#虚拟主机名称是www.jd.com,请求域名www.jd.com的url将由此server配置解析
server_name www.jd.com;
#所有的请求都以/开始,所有的请求都可以匹配此location
location / {
#使用root指令指定虚拟主机目录即网页存放目录
#比如访问http://ip/test.html将找到/usr/local/html_jd/test.html
#比如访问http://ip/item/test.html将找到/usr/local/html_jd/item/test.html
root /usr/local/html_jd;
#指定欢迎页面,按从左到右顺序查找
index index.html index.htm;
}
}
#配置虚拟主机www.baidu.com
server {
listen 124.127.99.32:80;
server_name www.baidu.com
location / {
root /usr/local/html_baidu;
index index.html index.htm;
}
}
3:使用Nginx实现反向代理:
通常的正向代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的。
反向代理应该是Nginx做的最多的一件事了,什么是反向代理?百度百科给出的定义:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同。反向代理服务器决定哪台服务器提供服务,它不提供服务,仅仅是服务的转发。
具体实现:两个域名指向同一台nginx服务器,用户访问不同的域名显示不同的网页内容。两个域名是www.jd.com.cn和www.baidu.com
Nginx配置:
#配置一个代理即tomcat1服务器
upstream jd{
server 124.127.99.32:8080;
}
#配置一个虚拟主机
server {
listen 80;
server_name www.jd.com;
location / {
#域名www.jd.com的请求全部转发到jd服务上
proxy_pass http://jd;
#欢迎页面,按照从左到右的顺序查找页面
index index.jsp index.html index.htm;
}
}
upstream baidu{
server 124.127.99.32:8081;
}
server {
listen 80;
server_name www.baidu.com;
location / {
#域名www.baidu.com的请求全部转发到baidu服务上
proxy_pass http://baidu;
index index.jsp index.html index.htm;
}
}
最后重新加载配置文件[root@localhost nginx]# sbin/nginx -s reload
4、Nginx实现负载均衡,使用端口不同来模拟。
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
upstream jd{
server 124.127.99.32:8081;
server 124.127.99.32:8082;
}
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
5、upstream 支持的负载均衡算法:
5.1、轮询RR(默认) :每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。这种策略有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
5.2、ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,也可以作为分布式环境中session问题的解决办法之一。
upstream jd{
ip_hash;
server 124.127.99.32:8081;
server 124.127.99.32:8082;
}
5.4、fair(第三方):这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream jd{
server 124.127.99.32:8081;
server 124.127.99.32:8082;
fair;
}
5.5、url_hash(第三方):此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream jd{
hash $request_uri;
hash_method crc32;
server 124.127.99.32:8081;
server 124.127.99.32:8082;
}
6、upstream 支持的状态参数
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。