团队介绍

我们是光大科技有限公司智能云计算部运维服务团队系统运维项目组,致力保障和服务集团各业务系统操作系统、中间件和数据库的稳定、安全、高效的运转,降低集团各业务系统以及业务运行的风险,为集体信息化建设保驾护航。我们的团队拥有经验丰富的操作系统、中间件和数据库领域的专家,将不定期分享运维领域的原创技术文章和实践经验,共同探索金融科技领域IT运维的最佳实践和发展趋势。

01

Nginx基础知识

1

简介

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的优点

2

Nginx作为HTTP服务器,有以下几项基本特性:

  1. 静态文件处理,索引文件和自动索引,打开文件的描述符缓冲;
  2. 反向代理加速无缓存、负载均衡和容错;
  3. FastCGI;
  4. 模块化的结构:包括chunked、byte、responses、gzipping、ranges以及SSI-filter等filter;
  5. 支持SSL和TLS;
  6. Nginx专为性能优化开发,性能是重要的考量;
  7. Nginx有很高的稳定性。Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持10000个没有活动的连接,只占2M内存。

02

Nginx安装及调试

1

pcre安装

./configuremake && make installcd ../

Nginx编译安装

2

/configure --user=nginx --group=nginx --prefix=/usr/local/nginx/ --with-http_stub_status_module  \--with-openssl=/usr/local/openssl  \make && make install

更多模块的安装方法请参照官方wiki。

3

Nginx配置文件测试

# /usr/local/nginx/sbin/nginx –t   //测试配置文件有没有错误

结果返回如下:

2020/8/16 19:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.confsyntax is ok

Nginx启动

4

# /usr/local/nginx/sbin/nginx

5

Nginx配置文件修改重新加载

# kill -HUP `cat /usr/local/nginx/logs/nginx.pid

03

Nginx Rewrite

1

Nginx基本标记(flags)

last -    基本上都用这个Flag。相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则

break -    中止Rewrite,不再继续匹配

redirect -    返回临时重定向的HTTP状态302

permanent -    返回永久重定向的HTTP状态301,原有的URL支持正则重写的URL不支持正则

正则表达式匹配

2

* ~    为区分大小写匹配

* ~*    为不区分大小写匹配

* !~和!~*    分别为区分大小写不匹配及不区分大小写不匹配

3

文件及目录匹配

* -f和!-f用来判断是否存在文件

* -d和!-d用来判断是否存在目录

* -e和!-e用来判断是否存在文件或目录

* -x和!-用来判断文件是否可执行

04

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;    }    ........................}

05

Nginx目录自动加斜线

if (-d $request_filename) {    rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;}

06

Nginx Location

基本语法:和上面rewrite正则匹配语法基本一致。

location [=|~|~*|^~] /URL/  {    …}* ~           为区分大小写匹配* ~*          为不区分大小写匹配* !~和!~*     分别为区分大小写不匹配及不区分大小写不匹配

示例1

location = /  {    # 只匹配 / 查询}# 匹配任何查询,因为所有请求都以/开头。但是正则表达式规则和长的块规则将被优先和查询匹配

示例2

location ^~ /images/ {# 匹配任何以 /images/ 开头的任何查询并且停止搜索,任何正则表达式将不会被测试

示例3

location ~* \.(gif|jpg|jpeg)$  {}# 匹配任何以 gif、jpg 或 jpeg 结尾的请求

07

Nginx expires

1

根据文件类型expires

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {    if (-f $request_filename) {        root /gdkj/www/;        expires 1d;        break;    }}

根据判断某个目录

2

location ~ ^/(images|javascript|js|css|flash|media|static)/ {    root  /gdkj/www/;    expires 30d;}

08

Nginx负载均衡

1

Nginx负载均衡基础知识

Nginx的upstream目前支持5种方式的分配:

  1. 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  2. weight
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
  3. ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  4. fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
  5. url_hash(第三方)

Nginx负载均衡实例

2

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进行匹配,可以进行重定向或者进行新的代理负载均衡

09

常见问题与错误处理

1

400 bad request错误的原因和解决办法

配置nginx.conf相关设置如下:

client_header_buffer_size 16k;large_client_header_buffers 4 64k;

根据具体情况调整,一般适当调整值就可以。

Nginx 502 Bad Gateway错误

2

proxy_next_upstream error timeout invalid_header http_500 http_503;

或者尝试设置:

large_client_header_buffers 4 32k;

3

Nginx出现的413 Request Entity Too Large错误

这个错误一般在上传文件的时候会出现,编辑Nginx主配置文件Nginx.conf,找到http{}段,添加:

client_max_body_size 10m; //设置多大根据自己的需求作调整

解决504 Gateway Time-out(nginx)

4

这种情况可能是nginx默认配置fastcgi进程响应缓冲区太小造成的,这将导致fastcgi进程挂起,如果fastcgi服务对这个挂起处理的不及时,那么就极有可能导致504Gateway Time-out,如果一个HTML页达到了几百K。默认的fastcgi进程响应的缓冲区是8K,可以设置大点,在nginx.conf里加入:

fastcgi_buffers 8 128k; //设置 fastcgi 缓冲区为 8×128k

5

如何使用Nginx Proxy

一台服务器运行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

如何关闭Nginx的日志

6

access_log /dev/null;error_log /dev/null;



nginx默认首页文件html内容 nginx 配置默认页面_nginx

以上就是本期的Nginx常见配置总结,文中有不足之处,请提出宝贵的意见。

参考文献

Nginx官方wiki https://www.nginx.com/resources/wiki/



欢迎关注EBCloud

作者:江湖人称晓明哥