我们终将在,没有黑暗的地方相见。 ~乔治《1984》
Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources ldentifier)URl或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存sz操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。
这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。
特点
- 是一个高性能的HTTP和反向代理web服务器,轻量级提供了IMAP/POP3/SMTP服务
- 发布于2004年10月4日(第一个公开版本0.1.0 )Nginx的1.4.0稳定版已经于2013年4月24日发布C语言编写
- Nginx是一个跨平台服务器
- Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。
优势
- 占有内存少(在3W并发连接中,开启的10个nginx进程消耗内存大约150M)
- 高并发能力强(官方测试能够支撑5W并发连接,在实际生产环境中能到2-3W并发连接数)简单(配置文件通俗易懂)
- 价格(免费、开源)
- 支持Rewriter重写(能够根据域名、URL的不同,将HTTP请:求分到不同的后端服务器群组)内置健康检查(如果nginx后端有几个服务宕机了,不会影响前端访问,能自动检测服务状态)节省带宽(支持GZIP压缩,可以添加浏览器本地缓存的Header头)
稳定性高,反向代理,很少宕机 - 中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
功能:web服务器、轻量级;负载、均衡;缓存;高并发
应用场景:代理服务器;IP负载、静态负载;动静分离;限流、健康监控
安装和命令
安装:
sudo apt-get install nginx
查看版本
nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
基本命令
vi /usr/share/nginx/html/index.html
curl 192.168.100.111
nginx -s stop
/usr/sbin/nginx
nginx –t
nginx –s reload
tail -f filename
tail -n 行数 文件名 例: tail -n 100 /var/log/aa.log
ip addr del 192.168.11.5/32 dev lo (lo eth1 eth2)
ipvsadm –C
ip a|grep eth0|grep inet|awk ‘{print $2}’|cut -d “/” -f1
curl -I -m 10 -o /dev/null -s -w %{http_code} 10.110.26.10:8080
nohup java -jar /usr/sbin/项目名.jar >>/var/log/项目名.log 2>&1 &
echo $?
ps aux | grep nginx | greo –v grep
配置文件
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/sites-enabled/*
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
代理模式和配置反向代理
-
正向代理(forward proxy) :是一个位于客户端(用户A)和原始服务器(origin server)(目标服务器)之间的服务器(代理服务器),为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的配置才能使用正向代理。一般情况下,如果没有特别说明,代理技术默认是指正向代理技术。
相当于是一个职业中介,且客户端和实际服务器不能沟通,客户端知道他是中介
-
反向代理(reverse proxy)︰和正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
相当于是一个买房和卖房的人,买房的时候相对于卖房的是一个买房的,卖房的时候相对于买房的是一个卖房的。 客户端不知道他是一个代理服务器,服务器也认为他只是客户端而不是代理服务器
-
透明代理∶透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的requestfields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。透明代理实践的例子就是时下很多公司使用的行为管理软件
upstream localhost {
server 192.168.136.133:8081;
server 192.168.136.133:8081;
server 192.168.136.133:8081;
}
server {
listen 80
server_name localhost;
location / {
proxy_pass http://localhost;
}
}
负载均衡方法:
- 轮询法(默认)
- 加权轮询法(权重)
- Fair
- url_hash
- 源地址哈希法
- 最小连接法(least_conn)
动静分离
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离
严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面
动静分离从目前实现角度来讲大致分为两种:
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
- 一种是动态跟静态文件混合在一起发布,通过nginx来分开
mkdir static
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css) $ {
root /static;
expires 30d;
}
}
日志管理
日志格式
- 日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式
- 默认“main”日志格式
og_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr:客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user:用于记录远程客户端的用户名称(一般为“-”)
$time_local:用于记录访问时间和时区
$request:用于记录请求的url以及请求方法
$status:响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent:给客户端发送的文件主体内容字节数
日志切割
- nginx的日志文件没有rotate功能
- 编写每天生成一个日志,我们可以写一个nginx日志切割脚本来自动切割日志文件
- 第一步就是重命名日志文件 (不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,Linux是靠文件描述符而不是文件名定位文件 )
- 第二步向nginx主进程发送USR1信号
- nginx主进程接到信号后会从配置文件中读取日志文件名称
- 重新打开日志文件 (以配置文件中的日志名称命名) ,并以工作进程的用户作为日志文件的所有者
- 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件
- 工作进程立刻打开新的日志文件并关闭重名名的日志文件,然后你就可以处理旧的日志文件了。[或者重启nginx服务]
nginx日志按每分钟自动切割脚本如下 :
新建shell脚本:
高并发架构分析
什么是高并发?
- 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
- 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS (Query Per Second),并发用户数等。
- 响应时间:系统对请求做出响应的时间
- 吞吐量:单位时间内处理的请求数量。
- QPS:每秒响应请求数
如何提升系统的并发能力?
- 互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(ScaleUp)与水平扩展(Scale Out)。
- 垂直扩展:提升单机处理能力。垂直扩展的方式又有两种。
在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。
不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展。
水平扩展:只要增加服务器数量,就能线性扩充系统性能。
服务器都有极限
三种方式实现
- limit_conn_zone(限制连接流)
- limit_req_zone(限制请求流)
- ngx_http_upstream_module(后台服务限制)
此处插上一个小工具:限制测试工具下载
yum install http-tools -y
key | 含义 |
---|
Document Path | 测试的页面 | Document Length | 页面的大小 | Concurrency Level | 并发数量、并发用户数 | Time taken for tests | 测试耗费总时间 | Complete requests | 请求总量、并发连接数 | Failed requests | 请求失败的数量 | Write errors | 错误数量 | Requests per second | 每秒钟的请求量吞吐率 | Time per request | 每次请求需要时间响应时间 |
限制连接流
http {
limit_conn_zone $binary_remote_addr zone=one:10m;
server {
limit_conn one 10;
}
}
限制请求流(限速)
http {
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server {
limit_req zone=req_one brust=120;
}
}
后台服务限制
- 该模块是提供了我们需要的后端限流功能的
- 该模块有一个参数: max_conns可以对服务端进行限流,可惜在商业版nginx中才能使用
- 在nginx1.11.5版本以后,官方已经将该参数从商业版中脱离出来了,也就是说只要我们将生产上广泛使用的nginx1.9.12版本和1.10版本升级即可使用
server {
server 127.0.0.1:8080 max_conns=100;
}
安全配置
版本安全
http {
server_tokens off;
}
IP安全
http {
location / {
allow 127.0.0.1;
deny all;
}
}
文件安全
http {
location /logs{
autoindex on;
root /static;
}
location ^/logs~*\.(log|txt)$ {
add_header Content_Type text/plain;
root /static;
}
}
连接安全
http {
}
Nginx优化
调整Nginx的主配置文件,增加并发量
worker_processes 2;
events {
worker_connection 65535;
}
Nginx长连接:HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,
nginx长连接短连接,可以增强服务器的容灾能力
减少了建立和关闭连接的消耗和延迟。如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被转换成短连接发送给服务器端,为了支持长连接,我们需要在nginx服务器上做一些配置
使用nginx时,想要做到长连接,我们必须做到以下两点:
- 从client到nginx是长连接(events)
- 从nginx到server是长连接(http)
对于客户端而言,nginx其实扮演着server的角色,反之,之于server,nginx就是一个client
events {
keepalive_timeout 60;
}
http {
keepalive_timeout 60;
}
Nginx压缩
- gzip压缩作用:将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度,压缩会消耗nginx的cpu性能。
- gzip压缩可以配置http,server和location模块下
http {
gzip on;
默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。
gzip_min_length 2k;
位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k
为单位的4倍申请内存。
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/xjavascript text/css application/xml;
gzip_http_version 1.0
gzip_disable "MSIE [1-6]\.";
务器必须要返回包含"Via"的 header头。
gzip_proxied expired no-cache no-store private auth;
gzip_vary on
}
状态监控
server {
location /NginxStatus {
stub_status on;
access_log off;
}
}
插件安装
./configure --prefix=... --with-http_stub_status _module
|