nginx使用分享-阿里云开发者社区

开发者社区> 阿里云GTS能力中心-浩鲸智能> 正文
登录阅读全文

nginx使用分享

简介: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。Nginx的并发能力在同类型的Web服务器中表现优异,国内主流无论大小互联网公司都在用。

一、nginx使用分享

(一)nginx简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。Nginx的并发能力在同类型的Web服务器中表现优异,国内主流无论大小互联网公司都在用。

1.核心优势

(1)高扩展性

Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。这种低耦合度的优秀设计,成就了Nginx庞大的第三方模块,能满足几乎各种需求,而且还支持开源定制扩展模块,极具灵活性。

(2)高可靠性

Web服务器高可靠性是生命线,而Nginx的可靠性是有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务

(3)内存消耗少

内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M×10=150M),这是Nginx支持高并发连接的基础。

(4)高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。

(5)热部署

master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件,还支持不停止服务就更新配置项、更换日志文件等功能。

(6)配置简单

(二)nginx能干什么

1.正,反向代理

所谓“代理”,是指在内网边缘 设置一个硬件/软件转发请求;

“正向”还是“反向”的说法,取决于转发的是"出站请求"还是"入站请求"。

正向代理:处理来自客户端的出站请求,将其转发到Internet,然后将生成的响应返回给客户端。和反向代理不同之处在于,典型的正向代理是一种最终用户知道并主动使用的代理方式。

反向代理:处理来自Internet的入站请求,将其转发给后端工作程序,然后将响应返回给Internet。

image.png

正向代理和反向代理 在代理的方向上不同,但都会代理处理HTTP请求/响应。

代理服务器存在的目的:

堡垒机/隔离内网: 内网客户端无法访问外网需要设置堡垒机、隐藏内网工作服务器

代理服务器附加功能: 对流量执行操作、使用缓存或压缩来提高性能、防御攻击并过滤信息

2.负载均衡

负载均衡一般伴随着反向代理, 起到了 分配流量、透明代理、 增强容错的效果

3.动静分离

动静分离与现在火热的前后端分离概念火热相关,前端可以自行开发、测试,自行使用nginx形成静态资源服务器,后端服务仅作为附加资源。

(三)nginx基础配置

nginx的主配置文件默认在/etc/nginx,文件名为nginx.conf,一般的应用配置不要放在这里,这里只配置一些公用的属性,比如开启压缩、日志目录、超时时间等,不同应用的配置一般放在/etc/nginx/conf.d目录下,针对不同的模块新建不同的配置文件,命名规则为“模块名.conf”。

(四)nginx的https配置

1.基本服务配置

server{

        listen 433;

        ssl on;

        server_name localhost;

        ssl_certificate  .../server.pem; #指定证书地址

        ssl_certificate_key  .../server.key; #指定私钥地址

        ssl_client_certificate  .../ca.crt; #指定ca证书

        ssl_verify_depth 1; #设置客户端证书链中的验证深度。

        ssl_session_timeout  5m; #指定客户端可以重用会话参数的时间

        ssl_verify_client on; #认证客户端

        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;#协议

        ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;

        ssl_prefer_server_ciphers   on;#指定使用SSLv3和TLS协议时,服务器密码应优先于客户端密码。

        location /{

            ... #省略具体代理配置

        }

    }

根据安全级别,选择加密套件

https://wiki.mozilla.org/Security/Server_Side_TLS

注:因为较高的加密算法需要较新的客户端支持,为了兼容客户需求可以加上较低版本的加密算法,但是在客户端满足要求时建议使用最高版本加密协议,以增强安全性

根据wiki上的说明可以知道,TLSv1.2需要客户端满足以下要求:Firefox 27, Chrome 30, IE 11 on Windows 7, Edge, Opera 17, Safari 9, Android 5.0, and Java 8.

如果客户机器太多老旧,比如说xp系统和ie6浏览器,那我们就需要使用SSLv3。

2.获得client证书

在项目中,有时需要在服务端验证客户端的证书信息,这就需要nginx能将客户端的证书信息转到后台服务。

nginx不是在进程内加载module来运行php或者java,而是通过代理的方式将HTTP请求转交给PHP或者Java进程,因此nginx是通过HTTP头的方式将客户端的证书信息交给Java。

image.png

其中的$ssl_client_s_dn是nginx的内置变量,代表客户端证书的主题名,它支持的所有变量详见:

http://nginx.org/en/docs/http/ngx_http_ssl_module.html

java等应用层代码中,可以通过获取http的头部信息来取得客户端的证书信息:

 参考链接如下:

http://stackoverflow.com/questions/11840873/how-to-proxy-http-x-ssl-client-s-dn-header

(五)nginx负载均衡

负载均衡:建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

由于请求量、数据量较大,单台服务器不能扛住压力,可能造成服务器宕机,就需要扩展服务器,为了使多台服务器均摊压力,使每台机器上的压力减小不至于宕机,就需要使用负载均衡来实现。

image.png

1.负载均衡策略

Nginx 提供轮询(round robin)、IP 哈希(client IP)和加权轮询 3 种方式,默认情况下,Nginx 采用的是轮询。

(1)轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver {

server 192.168.1.14;

server 192.168.1.15;

}

(2)加权轮询

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backserver {

   server 192.168.1.14 weight=1;

   server 192.168.1.15 weight=2;

}

(3)ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {

   ip_hash;

   server 192.168.0.14;

   server 192.168.0.15;

}

2.重试策略

可以为每个 backserver 指定最大的重试次数,和重试时间间隔,所使用的关键字是 max_fails 和 fail_timeout。

upstream backserver {

server 192.168.1.14 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.15 weight=2  max_fails=2 fail_timeout=30s;

}

失败重试次数为3,且超时时间为30秒。

3.热机策略

当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就会使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。

upstream backserver {

server 192.168.1.14 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.15 weight=2 max_fails=2 fail_timeout=30s;

server 192.168.1.16 backup;

}

(六)实用功能

1.通过端口支持同一域名下多个webapp。

2.绑定Https证书。

 

upstream receiver_server {

        server receiver:80;

 }

 upstream app_server {

        server app:80;

 }

 server {

        listen       443 ssl http2;

        server_name  taobao.com;

        ssl_certificate         /server.crt;

        ssl_certificate_key     /server.key;

        location / {

            proxy_pass         http://receiver_server/;

        }

   }

 server {

        listen 8080 ssl http2;

        server_name             taobao.com:8080;

        ssl_certificate         /server.crt;

        ssl_certificate_key     /server.key;

        location / {

            proxy_pass         http://app_server/;

        }

    }

3.支持rewrite重写规则: 能够根据域名、url的不同,将http请求分发到后端不同的应用服务器节点上。

4.内置健康检查功能: 如果后端的某台应用节点挂了,请求不会再转发给这个节点,不影响线上功能。

关键指令: max_fails, fail_timeout

upstream backend {

    server backend1.example.com weight=5;

    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;

    server unix:/tmp/backend3;

    server backup1.example.com  backup;

}

5.节省带宽: 支持gzip压缩。

6.解决跨域问题① 反向代理 ② 增加CORS响应头

在前后端分离项目,对跨域请求增加CORS响应头、对静态资源开启gzip压缩

   location / {

            gzip on;

            gzip_types application/javascript text/css image/jpeg;

           root /usr/share/nginx/html;

           index index.html index.htm;

           try_files $uri /index.html;

           add_header 'Access-Control-Allow-Origin' '*';

           add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';

           add_header 'Access-Control-Allow-Headers' 'Content-Type';

           add_header 'Access-Control-Allow-Credentials' 'true';

        }

(七)nginx常用命令

1.启动nginx

[root@localhost ~]# /usr/local/nginx/sbin/nginx

##也可通过service命令

[root@localhost ~]# sevice nginx start

2.停止nginx

 [root@localhost sbin]# nginx -s stop

##也可通过service命令

[root@localhost ~]# sevice nginx stop

##优雅关闭nginx(不接受新的连接请求,等待旧的连接请求处理完毕再关闭)

[root@songguoliang sbin]# nginx -s quit

3.重新加载配置文件

[root@localhost sbin]# nginx -s reload

注:当系统有升级时,尽量不要使用重启nginx的方式来重新加载配置文件,因为重启会造成一定时间的服务不可用,很不友好,尽量使用重新加载的命令来实现无缝升级。

4.测试配置文件

[root@localhost sbin]# nginx -t

(八)nginx日志分析

nginx的日志文件默认存放在/var/log/nginx/目录下(根据nginx.conf配置可能不同)。

nginx的log日志分为access log 和 error log。

其中access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息

error log 则是记录服务器错误日志,形式如下:

image.png

其中包含了请求时间、错误原因、客户端地址、服务器地址、请求类型(GET、POST)、http协议版本、服务器ip和端口、错误来源页面(文件)。当页面异常是可以通过error日志来快速的找到问题所在

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

阿里云GTS能力中心(浩鲸智能),从交付的视角探讨数字化转型过程中大型软件开发实践、以及阿里云产品在各行业被集成的案例分享、技术沉淀等内容。敬请关注!

官方博客
官网链接