Nginx
一、什么是nginx
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以性能为王;
二、环境搭建
1、下载地址
免费开源版的官方网站:http://nginx.org
商业版本的Nginx:http://www.nginx.com
2、安装
Nginx的安装需要Linux安装相关的几个库,否则配置和编译会出现错误;
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
Nginx可以进行二次开发,你可以修改它里面的东西或者扩展一些东西;
安装步骤
- 1、解压,执行命令:tar -zxvf nginx-1.16.1.tar.gz
- 2、切换至解压后的nginx主目录:cd nginx-1.16.1
- 3、在nginx主目录nginx-1.16.1下执行命令:
./configure --prefix=/usr/local/nginx
(其中--prefix是指定nginx安装路径)
- 4、执行命令进行编译:make
- 5、执行命令进行安装:make install
3、常用命令
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
三、配置
1、运行中的Nginx进程间的关系
部署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模型;
2、配置文件
配置文件注意包括:
- 1、全局配置
- 2、http配置(http内部的全局配置,http内部的多个server配置)
块配置项一定会用大括号把一系列所属的配置项全包含进来,块配置项可以嵌套,内层块直接继承外层块,当内外层块中的配置发生冲突时,以内层块为准;
具体配置项官方文档是以模块进行说明的;
http://nginx.org/en/docs/http/ngx_http_upstream_module.html 就是负载均衡如何配置的文档,其他模块也有相对应的文档;
如果我们只是使用nginx,其实就是在对配置文件nginx.conf进行各种配置;
3、静态网站
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
4、虚拟主机
一个nginx可以配置多个网站;
(1)基于端口的虚拟主机
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;
}
}
(2)基于域名的虚拟主机
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;
}
}
5、负载均衡
文档:http://nginx.org/en/docs/http/load_balancing.html
我们知道Nginx的各种应用就是对其进行配置即可完成,所以实现负载均衡也是对nginx.conf进行配置,配置负载均衡只需要两步:
- 1、配置一个upstream
- 2、配置location里面的 proxy_pass
1、轮询(默认)
每一台机器访问一次,轮流去访问每一台机器;
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;
}
2、权重策略
按比例访问,下面的配置就是5:2
upstream backserver {
server 192.168.0.13 weight=5;
server 192.168.0.14 weight=2;
}
3、ip hash负载均衡策略
相当于一个用户绑定到了后台的一个具体的tomcat机器上,只有ip不变那么该用户就永远是访问后台的某一个固定的tomcat机器,可以用来快速解决session共享的问题,但此方案存在一些不足;
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
4、最少连接数
使用最少连接的负载均衡,nginx将尝试不会把过多的请求负载到繁忙的应用程序服务器上,而是将新请求分发到较不繁忙的服务器上;
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
5、另外几个配置参数
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状态,不参与负载均衡)
}