1 nginx是什么
nginx是由俄罗斯人发明的一款高性能的web服务器,它同早期的Apache,IIS,Lighttpd等都具有web服务器的功能,能够发布网站代码等资源,为用户提供信息资讯。但是nginx的功能不单单只是做为web服务器,它还可以用来做反向代理和负载均衡服务器,并且整体性能非常强大,在web前端服务器目前是企业的首选。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器
2 nginx能做什么
2.1 nginx可以做反向代理
nginx的反向代理是nginx的是个非常重要的功能,它可以隐藏后端服务器的数量,并且保证后端服务器免受攻击
2.2 nginx可以做负载均衡
nginx的负载均衡其实是反向代理的延伸,当单台后端服务器无法处理前端庞大的请求时,可以为后端多准备几台服务器,共同分摊流量,这就是负载均衡,也叫均衡负载
2.3 nginx可以做域名重定向
重定向也是web服务器非常重要的功能,我来举一个例子:假设你们公司现在有一个域名,很多老用户已经习惯了是这个域名来访问你们的网站。但是你们公司经过改造,需要更换域名,这时就会面临丢失很多老用户的问题。那么这个问题通过nginxd的重定向就可以解决,我们只需要把访问老域名的流量重定向新域名就可以了。这个技术的实战,运维朱工会在后面通过实例演示。
除了做域名重定向,还有内部重定向,比如用户访问到没有的资源,我们希望给用户返回指导用户或者首页。这时,就可以写内部重定向实现了。
2.4 nginx可以做动静分离
nignx的动静分离其实也是nginx的反向代理的功能,只是它很强大和特别,所以一般单独拿出来说。因为nginx处理静态资源的能力非常强,效率非常高。所以很多时候,我们会将用户请求的静态资源直接交由nginx代理服务器处理,然后把动态的应用程序代理到后端,给应用服务器处理,以此来提高用户体验。
2.5 其他功能
nginx还有很多强大的功能,比如做缓存服务器,邮件代理服务器,还可以做微服务网关等。所以这么一个强大的服务应用
3 nginx的优点
3.1 速度更快并发更高
单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务器更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。
3.2 配置简单扩展性强
Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。
3.3 高可靠性
Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。
3.4 热部署
现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。
3.5 成本低代码开源
3.6 配置简单
4 nginx的缺点
4.1 Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点
4.2 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测
4.3 不支持Session的直接保持,但能通过ip_hash来解决。
5 nginx目录文件说明
5.1 conf目录
存放nginx配置文件的目录
- fastcgi.conf:存放fastcgi 相关的配置
- fastcgi.conf.default:fastcgi.conf 的原始备份文件,用于还原
- fastcgi_params:fastcgi 相关参数文件
- fastcgi_params.default:fastcgi_params 的原始备份文件,用于还原
- koi-utf:编码转换映射文件
- koi-win:编码转换映射文件
- mime.types:存放媒体资源的类型,例如:xml、html、css
- mime.types.default:mime.types 的原始备份文件,用于还原
- nginx.conf:nginx 默认主配置文件
- nginx.conf.default:nginx.conf 的原始备份文件,用于还原
- scgi_params:与fastcgi_params一样,传递哪些服务器的变量
- scgi_params.default:scgi_params 的原始备份文件,用于还原
- uwsgi_params:服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回
- uwsgi_params.default:uwsgi_params 的原始备份文件,用于还原
- win-utf:编码转换映射文件
5.2 fastcgi_temp目录
- fastcgi_temp:临时存放fastcgi 数据的目录
5.3 html目录
网站的根目录,访问的网站页面信息都存放在这个目录下
-
50x.html:网站的错误页面,所以500的错误页面
-
idnex.html:默认首页
5.4 logs目录
- access.log:访问日志,记录访问 nginx 页面的信息,包括IP地址、谁来访问的、访问的页面、响应状态码等
- error.log:错误日志,nginx 的错误文件,启动错误,就看这个日志
- nginx.pid:nginx 的 pid 进程号
5.5 proxy_temp目录
- proxy_temp:代理的数据临时存放的目录
5.6 sbin目录
- nginx:nginx启动命令
6 nginx.conf文件详解
nginx.conf文件主要分为三部分组成
6.1全局块:
从配置文件开始到events块之间的内容,主要会配置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
比如文件第一行的配置的;
Worker_processes 1; #启动工作进程数数量,一般设置和CPU核心数一致
这是nginx服务器并发处理服务的关键配置,worker_process 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
6.2 events块:
比如文件中的配置:
events{
events{
worker_connectiaons 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数
}
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个word process 可以同时支持的最大连接数等。
上述的例子表示每个work process 支持的最大连接数为1024
这部分的配置对nginx的性能影响较大,在实际中应该灵活配置
6.3 htttp块
shell
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。
-
og_format:指定日志格式
-
$remote_addr:远程客户端的IP地址
-
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白
-
$time_local: 访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时
-
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
-
$status:记录请求返回的http状态码,比如成功是200
-
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量
-
$http_referer:记录从哪个页面链接访问过来的(请求头Referer的内容 )
-
$http_user_agent:客户端浏览器信息(请求头User-Agent的内容 )
-
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过
-
$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端请求的服务器地址。
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.ph p;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
localtion 字段含义:" ~ " 区分大小写," .php$ " 转义字符含义," . " 在正则里面表示任意所有,通过 \ 转义含义," $ " 以 " .php " 结尾,如果匹配到以" .php " 结尾的文件,进入到 " html " 目录去找它,这个请求通过 " fastcgi_pass " 转交给本地的9000 端口,fastcgi默认的首页是 index.php4
7 配置负载均衡策略
Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html
-
轮循(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器宕机时,能被自动删除且请求不会受影响
-
weight权重
指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的情况,权重越高 被访问的概率就越大
-
ip hash
每个请求被访问ip的hash结果分配,这样每个访客访客固定访问一个后端服务器
-
fair
动态根据后端服务器处理请求的响应时间来进行负载分配,响应时间短的优先分配,时间长的 分配的请求会减少,nginx服务默认不支持这个算法,需要安装upstream_fair模块
-
url_hash
根据访问的UPL计算出的hash结果来分配请求,每个请求会指向固定的服务器,常用于nginx作为静态资源服务器的场景,可以提高缓存效率,nginx服务默认不支持这个算法,需要安装nginx的hash软件包
7.1 轮询配置(默认)
http {
# ... 省略其它配置
upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server example.com:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcats;
}
}
# ... 省略其它配置
}
- proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
- upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。
- upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:
7.2 权重weight
默认为1,将请求按照权重值配置分配给每台server
下面配置,表示6次请求中,100分配2次,101分配3次,102分配1次
upstream tomcats {
server 192.168.0.100:8080 weight=2; # 2/6次
server 192.168.0.101:8080 weight=3; # 3/6次
server 192.168.0.102:8080 weight=1; # 1/6次
}
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}
-
max_fails 参数
默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
-
fail_timeout 参数
默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
7.3 ip hash配置
-
ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面;
-
使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的;
-
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
**注意:**如果有服务器宕机则需要单独的使用 down 标识出来,不能直接删除配置代码,如果删除会导致nginx的hash算法重新计算,那么用户的回话或者缓存会失效掉,所以如果不需要这台服务器直接修改为 down 即可,也就是 server 192.168.0.102:8080 down;
upstream tomcats {
ip_hash;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080 down;
}
8 响应码说明
-
HTTP响应状态码
100-199:指客户端的响应动作
200-299:响应成功
300-399:文件或者目录发生了移动
400-499:客户端的错误
500-599:服务端的错误
-
常见的响应状态码
200:OK,访问成功
301:Moved,永久跳转,请求的页面已经被重新定义到其他位置
403:Forbidden,禁止访问,权限不够,检测网站根目录的权限
404:Not Found,未找到页面,路径不对、文件名不对、服务器上没有这个路径或者文件
500:Iternal server error,开启selinux 可能会导致
502:Bad Gateway,代理服务器有问题,nginx+php 转发的时候可能会出,转发的后端服务器没有找到,或者转发不对都可能导致这个问题
504:Gateway timeout,网关代理服务器请求后端服务器的时候,没有在指定的范围内完成解析,就会报错504