我们是光大科技有限公司智能云计算部运维服务团队系统运维项目组,致力保障和服务集团各业务系统操作系统、中间件和数据库的稳定、安全、高效的运转,降低集团各业务系统以及业务运行的风险,为集体信息化建设保驾护航。我们的团队拥有经验丰富的操作系统、中间件和数据库领域的专家,将不定期分享运维领域的原创技术文章和实践经验,共同探索金融科技领域IT运维的最佳实践和发展趋势。
Nginx基础知识
Nginx(engine x)是一个高性能的HTTP和反向代理Web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好。
Nginx作为HTTP服务器,有以下几项基本特性:
-
静态文件处理,索引文件和自动索引,打开文件的描述符缓冲;
-
反向代理加速无缓存、负载均衡和容错;
-
FastCGI;
-
模块化的结构:包括chunked、byte、responses、gzipping、ranges以及SSI-filter等filter;
-
支持SSL和TLS;
-
Nginx专为性能优化开发,性能是重要的考量;
-
Nginx有很高的稳定性。Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持10000个没有活动的连接,只占2M内存。
Nginx安装及调试
./configure
make && make install
cd ../
/configure --user=nginx --group=nginx --prefix=/usr/local/nginx/ --with-http_stub_status_module \\\\
--with-openssl=/usr/local/openssl \\\\
make && make install
更多模块的安装方法请参照官方wiki。
# /usr/local/nginx/sbin/nginx –t //测试配置文件有没有错误
结果返回如下:
2020/8/16 19:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf
syntax is ok
# /usr/local/nginx/sbin/nginx
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid
Nginx Rewrite
last – 基本上都用这个Flag。相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break – 中止Rewrite,不再继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301,原有的URL支持正则重写的URL不支持正则
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-用来判断文件是否可执行
Nginx Redirect
将所有xxxx.com与gdkj.xxxx.com域名全部自跳转到http://zzzz.com。
server
{
listen 80;
server_name xxxx.com xxxxx.com;
index index.html index.php;
root /gdkj/www/;
if ($host !~ \\\"^www\\\\.xxxx\\\\.com$\\\") {
rewrite ^(.*) http://www.zzzz.com$1 redirect;
}
........................
}
Nginx目录自动加斜线
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
Nginx Location
基本语法:和上面rewrite正则匹配语法基本一致。
location [=|~|~*|^~] /URL/ {
…
}
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
location = / {
# 只匹配 / 查询
}
# 匹配任何查询,因为所有请求都以/开头。但是正则表达式规则和长的块规则将被优先和查询匹配
location ^~ /images/ {
# 匹配任何以 /images/ 开头的任何查询并且停止搜索,任何正则表达式将不会被测试
location ~* \\\\.(gif|jpg|jpeg)$ {
}
# 匹配任何以 gif、jpg 或 jpeg 结尾的请求
Nginx expires
location ~* \\\\.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
root /gdkj/www/;
expires 1d;
break;
}
}
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /gdkj/www/;
expires 30d;
}
Nginx负载均衡
Nginx的upstream目前支持5种方式的分配:
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
-
weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
-
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
-
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
-
url_hash(第三方)
upstream gdkj.com { #定义负载均衡设备的Ip及设备状态
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加:
proxy_pass http://gdkj.com;
每个设备的状态设置为:
a) down表示单前的server暂时不参与负载;
b) weight默认为1,weight越大,负载的权重就越大;
c) max_fails:允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
d) fail_timeout:max_fails次失败后,暂停的时间;
e) backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
Nginx支持设置多个负载均衡,可以使不同的server使用。
client_body_in_file_only 设置为on可以将client post过来的数据记录到文件中用来做 debug
client_body_temp_path 设置记录文件目录可设置最多3层目录
location 对URL进行匹配,可以进行重定向或者进行新的代理负载均衡
常见问题与错误处理
配置nginx.conf相关设置如下:
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
根据具体情况调整,一般适当调整值就可以。
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设置:
large_client_header_buffers 4 32k;
这个错误一般在上传文件的时候会出现,编辑Nginx主配置文件Nginx.conf,找到http{}段,添加:
client_max_body_size 10m; //设置多大根据自己的需求作调整
这种情况可能是nginx默认配置fastcgi进程响应缓冲区太小造成的,这将导致fastcgi进程挂起,如果fastcgi服务对这个挂起处理的不及时,那么就极有可能导致504Gateway Time-out,如果一个HTML页达到了几百K。默认的fastcgi进程响应的缓冲区是8K,可以设置大点,在nginx.conf里加入:
fastcgi_buffers 8 128k; //设置 fastcgi 缓冲区为 8×128k
一台服务器运行tomcat为18080端口,IP:192.168.10.10:18080,另一台机器IP:192.168.10.18。通过访问http://192.168.10.18即可访问tomcat服务,配置为:
在192.168.10.18的nginx.conf上配置如下:
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid
access_log /dev/null;
error_log /dev/null;
Nginx官方wiki https://www.nginx.com/resources/wiki/
往期推荐 ●●
// 1
一个Java对象究竟占用多大内存?–Java性能优化基础
// 2
数据中心与云
// 3
如何让你的H5页面首屏秒开?首屏优化方案深度探讨
// 4
新一代报警处理引擎技术
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32759.html