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

(3)内存消耗少

内存消耗少: 3万并发连接下,开启10nginx进程仅消耗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”

(四)nginxhttps配置

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;#指定使用SSLv3TLS协议时,服务器密码应优先于客户端密码。

        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_dnnginx的内置变量,代表客户端证书的主题名,它支持的所有变量详见:

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

每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决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配置可能不同)

nginxlog日志分为access log error log

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

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

image.png

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

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
缓存 负载均衡 应用服务中间件
nginx 就该这么用
nginx 就该这么用
19 0
|
3月前
|
存储 Java 应用服务中间件
nginx
nginx
22 0
|
4月前
|
前端开发 安全 应用服务中间件
|
8月前
|
负载均衡 应用服务中间件 nginx
|
10月前
|
缓存 负载均衡 算法
Nginx介绍
Nginx介绍
106 0
|
11月前
|
负载均衡 应用服务中间件 nginx
五分钟进步系列之nginx(一)
五分钟进步系列之nginx(一)
|
缓存 负载均衡 JavaScript
Nginx 简单入门指北不指南
Nginx 简单入门指北不指南
102 0
|
缓存 负载均衡 算法
Nginx——详解
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
123 0
Nginx——详解
|
负载均衡 前端开发 安全
什么是nginx
什么是nginx
|
网络协议 应用服务中间件 网络安全
Nginx 实现OCSP Stapling
详解Nginx 如何实现OCSP Stapling
832 0