前阵子因为工作上的变故,有一阵子没有写东西,接下来继续开始写东西,仍以运维为主,可能会把自己学习业务知识方面的一些有趣的心得也一并写写。
这两天搭建nginx,收集了一些资料,现对收集的资料做个整理:
一、概述
Nginx是一个高性能的HTTP,以及可以提供反向代理、负载均衡、WEB服务器等功能的软件,其特点是占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。
二、nginx几个作用
1.反向代理
反向代理是指以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,或同一台服务器不同端口。
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / { #匹配指向请求URL后的路径,可以多个
proxy_pass http://localhost:8080; #URL后缀不得以在端口后加个工程目录
proxy_set_header Host $host:$server_port;
}
}
2.负载均衡
负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
1) RR(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
upstream test {
server localhost:8080;
server localhost:8081;
}
2) 权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
那么10次一般只会有1次会访问到8081,而有9次会访问到8080
3) ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
4) fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
5) url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用.
3.HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root e:wwwroot;
index index.html;
}
}
这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
4.动静分离(web分离)
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
upstream test{
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
location / {
root e:wwwroot;
index index.html;
}
# 所有静态请求都由nginx处理,存放目录为html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:wwwroot;
}
# 所有动态请求都转发给tomcat处理
location ~ .(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:wwwroot;
}
}
HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式
例: |
---|
语法规则: location [=|~|~*|^~] /uri/ { ... } |
= 表示精确匹配,这个优先级也是最高的^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。~ 表示区分大小写的正则匹配~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写) !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则/ 通用匹配,任何请求都会匹配到,默认匹配. |
5.正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log e:wwwrootproxy.access.log;
error_log e:wwwrootproxy.error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
注:负载均衡通常使用正向代理加upstream的方式
三、nginx主要配置说明
1、常用命令
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen 重新打开日志文件。
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v 显示 nginx 的版本。
nginx -V 显示 nginx 的版本,编译器版本和配置参数。
四、nginx配置说明
1、server:虚拟主要,可以根据需要配置多个
# vim /usr/local/nginx-1.5.1/conf/nginx.conf
#配置虚拟主机
server{
#虚拟主机的域名,可以写多个域名,类似于别名
server_name a.ttlsa.com;
listen 80;
#站点根目录,你网站文件存放的地方。注:站点目录和域名尽量一样
root /data/site/a.ttlsa.com;
access_log /data/logs/nginx/a.ttlsa.com-access.log main;
location /{
……
}
}
2、location:
location / { echo "/"; }
访问 http://a.ttlsa.com/nginx,因为完全匹配了”=/nginx”
# curl http://a.ttlsa.com/nginx =/nginx 访问 http://a.ttlsa.com/nginx,从第一个开始尝试匹配,最后匹配到了~* \.png$ . # curl http://a.ttlsa.com/xxx/1111.PNG (注意,这是大写) all-png 访问 http://a.ttlsa.com/static/1111.png,虽然 static 放在最后面,但是因为有^的缘故,他是最匹配的.# curl http://a.ttlsa.com/static/1111.png Static
3、 upstream
upstream monitor_server { server 192.168.0.131:80; server 192.168.0.132:80;} server { listen 80; server_name nagios.xxx123.tk; location / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://monitor_server;}}
4、include
include /etc/nginx/conf.d/*.conf;
5、超时设置
roxy_connect_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
报错日志:
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略)
1)缓冲区队列
下面的设置与连接及其如何排队相关。如果传入连接速率很高,导致性能参次不齐(例如一些连接似乎停滞了),改变这些配置会有效。
文件描述符是操作系统资源,用于表示连接、打开的文件,以及其他信息。NGINX 每个连接可以使用两个文件描述符。例如,如果NGINX充当代理时,通常一个文件描述符表示客户端连接,另一个连接到代理服务器,如果开启了HTTP 保持连接,这个比例会更低(译注:为什么更低呢)。对于有大量连接服务的系统,下面的设置可能需要调整一下:
当NGINX充当代理时,每个到上游服务器的连接都使用一个短暂或临时端口。可能需要修改这些设置:
以下是一些可以影响性能的NGINX指令。如上所述,我们只讨论自己能调整的指令。我们建议你在没有NGINX团队指导下,不要调整别的指令。
NGINX可以运行多个工作进程,每个都可处理大量并发连接。可以控制工作进程数,用下面的指令管理它们的连接:
长连接对性能有很大的影响,通过减少CPU和网络开销需要开启或关闭连接。NGINX终止所有客户端连接,创建到上游服务器独立的连接。NGINx支持客户端和上游服务器两种长连接。下面是和客户端的长连接相关的指令:
下面是和上游服务器长连接的相关指令:
要使用连接到上游服务器的长连接,必须要配置文件中下面的指令。
proxy_http_version 1.1; proxy_set_header Connection ""; |
---|
记录每个请求会消耗CPU和I/O周期,一种降低这种影响的方式是缓冲访问日志。使用缓冲,而不是每条日志记录都单独执行写操作,NGINX会缓冲一连串的日志记录,使用单个操作把它们一起写到文件中。
要启用访问日志的缓存,就涉及到在access_log指令中buffer=size这个参数。当缓冲区达到size值时,NGINX会把缓冲区的内容写到日志中。让NGINX在指定的一段时间后写缓存,就包含flush=time参数。当两个参数都设置了,当下个日志条目超出缓冲区值或者缓冲区中日志条目存留时间超过设定的时间值,NGINX都会将条目写入日志文件。当工作进程重新打开它的日志文件或退出时,也会记录下来。要完全禁用访问日志记录的功能,将access_log 指令设置成off参数。
操作系统的sendfile()系统调用可以实现从一个文件描述符到另一个文件描述符的数据拷贝,通常实现零拷贝,这能加速TCP数据传输。要让NGINX使用它,在http或server或location环境中包含sendfile指令。NGINX可以不需要切换到用户态,就把缓存或磁盘上的内容写入套接字 ,而且写的速度非常快,消耗更少的CPU周期。注意,尽管使用sendfile()数据拷贝可以绕过用户态,这不适用于常规的NGINX处理改变内容的链和过滤器, 比如gzip。当配置环境下有sendfile指令和激活内容更改过滤器的指令时,NGINX会自动禁用sendfile。
你可以设置多个限制,防止用户消耗太多的资源,避免影响系统性能和用户体验及安全。 以下是相关的指令:
NGINX的一些额外功能可用于提高Web应用的性能,调优的时候web应用不需要关掉,但值得一提,因为它们的影响可能很重要。 它们包括缓存和压缩。
一个启用NGINX缓存的情景,一组web或者应用服务器负载均衡,可以显著缩短对客户端的响应时间,同时大幅度降低后端服务器的负载。缓存本身就可以作个专题来讲,这里我们就不试图讲它了。参阅NGINX Plus管理手册的NGINX内容缓存。
所以使用更小的网络带宽。然而尽管压缩数据会消耗CPU资源,但当需要减少网络带宽使用时这样做非常有效。需要注意的是,不能对已压缩的文件再压缩例如JPEG 文件。有关更多的信息,请参阅“NGINX Plus管理指南”中的压缩和解压缩。