Nginx 是一个高性能的web服务器;
Nginx的竞争对手:Apache、Lighttpd、Tomcat、 Jetty、IIS;
Tomcat和Jetty面向Java语言,属于重量级的Web服务器,它的性能与Nginx没有可比性;
Apache的发展时期很长,也是世界第一Web服务器;(httpd)
Apache稳定、开源、跨平台等,出现的时间比较早,它被设计成了一个重量级的、不支持高并发的 Web服务器,如果有数以万计的并发HTTP请求同时访问,就会导致服务器上消耗大量内存,操作系统内核对成千上万的Apache进程做进程间切换也会消耗大量CPU资源,并导致HTTP请求的平均响应速度降低;
Lighttpd和Nginx一样,都是轻量级、高性能的Web服务器,欧美业界开发者比较钟爱 Lighttpd,国内的公司更青睐Nginx, Lighttpd在国内使用比较少;
Nginx是俄罗斯人Igor Sysoev使用C 语言开发的;
其作为Web服务器被广泛应用到大流量的网站上,包括腾讯、新浪、网易、 淘宝等访问量巨大的网站;
**Nginx是一个跨平台的Web服务器,**可运行在Linux、FreeBSD、Solaris、AIX、Mac OS、Windows等操作系统上;
对于高效处理大规模并发连接,nginx支持Linux上的epoll(epoll是Linux上处理大并发网络连接的利器,Nginx以性能为王;
免费开源版的官方网站:http://nginx.org
商业版本的Nginx:http://www.nginx.com
Nginx的安装需要Linux安装相关的几个库,否则配置和编译会出现错误;
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
Nginx可以进行二次开发,你可以修改它里面的东西或者扩展一些东西;
安装步骤
./configure --prefix=/usr/local/nginx
(其中--prefix是指定nginx安装路径)
configure命令
使用help命令可以查看configure包含的参数: ./configure --help
默认方式启动
直接执行Nginx二进制程序,例如:
./nginx
或者
/usr/local/nginx/sbin/nginx
默认读取的配置文件:/usr/local/nginx/conf/nginx.conf
指定配置文件启动
使用-c参数指定配置文件:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
检查Nginx配置文件是否正确:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
测试配置选项时,使用-q参数不把error级别以下的信息输出到屏幕 :
/usr/local/nginx/sbin/nginx -t -q
显示版本信息
使用-v参数显示Nginx的版本信息:
/usr/local/nginx/sbin/nginx -v
使用-V参数显示更多信息;
/usr/local/nginx/sbin/nginx -V
快速地停止服务
使用-s stop可以强制停止Nginx服务,-s参数是向正在运行的Nginx服务发送信号量,Nginx程序通过nginx.pid文件中得到master进程的进程ID,再向运行中的master进程发送TERM信号来快速地关闭Nginx服务:
/usr/local/nginx/sbin/nginx -s stop
实际上,也可以通过kill命令直接向nginx master进程发送TERM或者INT信号,效果是一样的;
kill -TERM 主pid
kill -INT 主pid
优雅地停止服务
如果希望Nginx服务可以正常地处理完当前所有请求再停止服务,那么可以使用-s quit参数来停止服务:
/usr/local/nginx/sbin/nginx -s quit
或者 执行命令:kill -QUIT 主pid
使运行中的Nginx重读配置项并生效
使用-s reload参数可以使运行中的Nginx服务重新加载nginx.conf文件:
/usr/local/nginx/sbin/nginx -s reload
底层是优雅关闭nginx,然后重新加载配置文件并启动
日志文件回滚
使用 -s reopen参数可以重新打开日志文件,这样可以先把当前日志文件改名或转移到其他目录中进行备份,再重新打开时就会生成新的日志文件,这个功能使得日志文件不至于过大:
/usr/local/nginx/sbin/nginx -s reopen
部署Nginx时都是使用一个master进程来管理多个worker 进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等,每一个worker进程用来提供互联网服务,master进程则只负责监控管理worker进程,当任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务,另外master进程还为管理员提供命令行服务,包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等操作;
master进程完全接管多个worker进程不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在多核CPU并发处理,另外要把worker进程数量设置得与CPU核心数量一致,这是Nginx与Apache服务器的不同之处;
在Apache上每个进程在一个时刻只处理一个请求,因此如果希望apache服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置得更多,通常会达到一台服务器拥有几百个上千个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗;
而Nginx一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此当Nginx上的进程数与CPU核心数相等时,进程间切换的代价最小,这些是nginx底层采用c语言调用Linux内核epoll事件模型来实现的,这是一种多路复用IO模型;
配置文件注意包括:
如果我们只是使用nginx,其实就是在对配置文件nginx.conf进行各种配置;
Nginx是用来提供对http请求的处理,但nginx不支持java、jsp,不支持部署war、jar,nginx并不是一个java服务器,你可以用nginx作为前端代理服务器(比如负载均衡),让它转发到后端的tomcat上,然后在tomcat上部署java程序;
server {
listen 80; #端口号
location / {
root /opt/www/; #静态文件路径
}
}
配置主要是注意路径的问题,避免出现404找不到页面;
http://192.168.123.126:80/ --> index.html
http://192.168.123.126:80/power --> index.html
http://192.168.123.126:80 = root的路径
/opt/www/power/index.html
一个nginx可以配置多个网站;
server {
listen 8080;
server_name localhost;
location /testweb{
proxy_pass http://www.testweb.com;
}
}
server {
listen 9090;
server_name localhost;
location /myweb{
proxy_pass http://www.myweb.com;
}
}
server {
listen 80;
server_name www.shop.com;
location /myweb {
proxy_pass http://www.shop.com;
}
}
server {
listen 80;
server_name www.power.com;
location /myweb {
proxy_pass http://www.power.com;
}
}
文档:http://nginx.org/en/docs/http/load_balancing.html
我们知道Nginx的各种应用就是对其进行配置即可完成,所以实现负载均衡也是对nginx.conf进行配置,配置负载均衡只需要两步:
每一台机器访问一次,轮流去访问每一台机器;
upstream abc {
server 127.0.0.1:9100;
server 127.0.0.1:9200;
server 127.0.0.1:9300;
}
location /myweb {
proxy_pass http://abc;
}
按比例访问,下面的配置就是5:2
upstream backserver {
server 192.168.0.13 weight=5;
server 192.168.0.14 weight=2;
}
相当于一个用户绑定到了后台的一个具体的tomcat机器上,只有ip不变那么该用户就永远是访问后台的某一个固定的tomcat机器,可以用来快速解决session共享的问题,但此方案存在一些不足;
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
使用最少连接的负载均衡,nginx将尝试不会把过多的请求负载到繁忙的应用程序服务器上,而是将新请求分发到较不繁忙的服务器上;
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
upstream backserver {
#max_fails 最大的失败次数,失败次数超过该值,就不会负载到该机器
#fail_timeout 最大失败次数后,再等多久可以再让该机器参与负载
server 127.0.0.1:9100 max_fails=3 fail_timeout=5;
server 127.0.0.1:9200 backup;
(其它所有的非backup机器down的时候,才请求backup机器)
}
upstream backserver {
server 127.0.0.1:9100;
server 127.0.0.1:9200 down;
(down表示当前的server是down状态,不参与负载均衡)
}