一、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。
正向代理和反向代理 在代理的方向上不同,但都会代理处理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。
其中的$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服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
由于请求量、数据量较大,单台服务器不能扛住压力,可能造成服务器宕机,就需要扩展服务器,为了使多台服务器均摊压力,使每台机器上的压力减小不至于宕机,就需要使用负载均衡来实现。
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 则是记录服务器错误日志,形式如下:
其中包含了请求时间、错误原因、客户端地址、服务器地址、请求类型(GET、POST)、http协议版本、服务器ip和端口、错误来源页面(文件)。当页面异常是可以通过error日志来快速的找到问题所在