概念(背景、F5)
Nginx (engine x) 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。该软件由伊戈尔·赛索耶夫创建并于2004年首次公开发布。2011年成立同名公司以提供支持。2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。
配置文件
配置文件nginx.conf中文详解#####
nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
进程pid文件
pid /usr/local/nginx/logs/nginx.pid;
events
{
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
worker_connections 1024;
#keepalive超时时间,单位秒。
keepalive_timeout 60;
}
设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
#文件扩展名与文件类型映射表 补充
include mime.types;
#默认文件类型
default_type application/octet-stream;
#默认编码
#charset utf-8;
#长连接超时时间,单位是秒
keepalive_timeout 120;
#gzip模块设置 (可以配置http,server和location模块下)
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #识别http协议的版本,早起浏览器可能不支持gzip自解压,用 户会看到乱码(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 5; #gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值;
gzip_types text/plain application/x-javascript text/css application/xml application/json; #压缩类型,默认就已经包含'text/html',所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on; #启用应答头"Vary: Accept-Encoding"
gzip_disable "MSIE [1-6]\."; #ie6以下就不启用gzip
gzip_proxied off; #nginx做为反向代理时启用,
off(关闭所有代理结果的数据的压缩),
expired(启用压缩,如果header头中包括"Expires"头信息),
no-cache(启用压缩,header头中包含"Cache-Control:no-cache"),
no-store(启用压缩,header头中包含"Cache-Control:no-store"),
private(启用压缩,header头中包含"Cache-Control:private"),
no_last_modefied(启用压缩,header头中不包含"Last-Modified"),
no_etag(启用压缩,如果header头中不包含"Etag"头信息),
auth(启用压缩,如果header头中包含"Authorization"头信息)
any - 无条件启用压缩
#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.w3cschool.cn w3cschool.cn;
location / {
root html;
index index.html index.htm;
}
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
expires 1h;
#跨域资源共享 CORS
add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
add_header 'Access-Control-Allow-Headers' 'Content-Type,*'; #表明服务器支持的所有头信息字段
}
}
常用命令
start nginx 启动nginx 或者双击文件夹下的nginx.exe
nginx -s quit 优雅停止nginx,有连接时会等连接请求完成再杀死worker进程
nginx -s reload 优雅重启,并重新载入配置文件nginx.conf
nginx -s reopen 重新打开日志文件,一般用于切割日志
nginx -v 查看版本
nginx -t 检查nginx的配置文件
nginx -h 查看帮助信息
nginx -V 详细版本信息,包括编译参数
nginx -c filename 指定配置文件
功能(前端开发需要掌握)
静态资源发布
-
使用场景
发布前端的静态工程、或者发布静态资源。
查看此链接即可。
-
根目录配置
在红框选择的地方指定nginx的根目录即可。
反向代理
-
使用场景
做外网映射;请求资源时,由于浏览器的同源策略导致的跨域。
参考批注中连接
负载均衡
负载均衡,英文名称为Load Balance,是一种技术,指通过某种算法实现负载分担的方法。通俗的讲就是统一分配请求的设备,负载均衡会统一接收全部请求,然后按照设定好的算法将这些请求分配给这个负载均衡组中的所有成员,以此来实现请求(负载)的均衡分配。
举个栗子:用电梯举例,假如从1楼到24楼吧,假如只有一部电梯,在早上上班高峰时期,10个人以内没啥问题,但是同时来50个人呢,就会有很大压力,就需要等待。但是现在有5部电梯同时工作呢,是不是就可以很有效的缓解压力。负载均衡也就是这个道理,通过集群来完成本应该一台服务器完成的工作。
upstream指令
upstream指令用于定义服务器集群
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 #最大次数 fail_timeout=30s; #延时30s
server unix:/tmp/backend3;
server backup1.example.com backup;
}
分配方式
Nginx的upstream支持5种 分配方式,其中 轮询、权重、IP散列这三种为Nginx原生支持的分配方式,fair 和 url_hash 为第三方支持的分配方式。
1、轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器 down 掉后,能自动剔除。
upstream zhang21(名称){
server 192.168.1.11:8888;
server 192.168.1.22:8888;
server 192.168.1.33:8888;
}
2、weight(权重)
轮询的加强版,既可以指定轮询比率,weight 和访问几率成正比,主要应用于后端服务器异质的场景下。
upstream zhang21 {
server 192.168.1.11 weight=1;
server 192.168.1.22 weight=2;
server 192.168.1.33 weight=3;
}
3、ip_hash
每个请求按照访问 Ip(即Nginx的前置服务器或客户端IP)的 hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 一致问题。
upstream zhang21 {
ip_hash;
server 192.168.1.11:7777;
server 192.168.1.22:8888;
server 192.168.1.33:9999;
}
4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间(rt)小的后端服务器优先分配请求。
upstream zhang21 {
server 192.168.1.11;
server 192.168.1.22;
server 192.168.1.33;
}
5、url_hash
与 ip_hash类似,但是按照访问 url 的 hash 结果来分配请求,使得每个 url 定向到同一个后端服务器,主要应用于后端服务器为缓存的场景下。
upstream zhang21 {
server 192.168.1.11;
server 192.168.1.22;
server 192.168.1.33;
hash $request_uri;
hash_method crc32;
}
其中,hash_method为使用的hash算法,需要注意,此时server语句中不能添加 weight等参数。
动静分离
服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片资源等等,有一部分是动态数据的请求。因为tomcat处理静态资源的速度比较慢,所以我们可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx处理,而把动态请求交给tomcat处理。
如下图所示,我们在机器上同时安装了nginx和tomcat,把所有的静态资源都放置在nginx的webroot目录下面,把动态请求的程序都放在tomcat的webroot目录下面,当客户端访问服务端的时候,如果是静态资源的请求,就直接到nginx的webroot目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。
location ~ .*.jsp$ #所有jsp的页面均交由tomcat处理
{
index index.jsp;
proxy_pass http://192.168.222.128:8080;#转向tomcat处理
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #设定访问静态文件直接读取不经过tomcat
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
其他
gzip
参考配置文件下的gzip讲解。
gzip最佳配置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #识别http协议的版本,早起浏览器可能不支持gzip自解压,用 户会看到乱码(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 5; #gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值;
gzip_types text/plain application/x-javascript text/css application/xml application/json; #压缩类型,默认就已经包含'text/html',所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on; #启用应答头"Vary: Accept-Encoding"
gzip_disable "MSIE [1-6]\."; #ie6以下就不启用gzip
gzip_proxied off; #nginx做为反向代理时启用,
静态资源缓存设置
nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。利用expires指令。
expires 3d; //表示缓存3天
expires 3h; //表示缓存3小时
expires max; //表示缓存10年
expires -1; //表示永远过期。
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
如果不想让代理或浏览器缓存,加no-cache参数:add_header Cache-Control no-cache; ,这样浏览器F5刷新时,返回的就是http 200,而不是http 304
include指令
使用 include 指令简化 Nginx 配置。假如有多个虚拟主机,配在同一个配置文件中就会显得杂乱无章,因此可以将不同的虚拟主机的配置,放入到不同的配置文件中,通过include引入,达到简化配置、便于管理的目的。当然一些其他的配置项均可以使用include来引入。
ip限制
封IP段比如从192.0.0.1到192.0.0.254的命令是:deny 192.0.0.0/24这其实就是把192.0.0.x这整个C端屏蔽了。还有一种方法,在nginx的conf目录下面新建配置文件为blocksip.conf:输入要屏蔽的地址deny 24.112.16.30; 保存一下。在nginx的配置文件nginx.conf中加入:include blocksip.conf;
重启一下nginx的服务:service nginx reload就可以生效了。
blocksip.conf:的格式还有许多种,可以配置只允许的IP访问或者IP段访问:
# block all ips
deny all;
# allow all ips
allow all;
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,在ip.balcklist中这样写
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
ip限制除了应用于整个nginx的访问,还可以单独给某个或者某几个应用去设置。
https
server {
listen 443 ssl; #监听的端口
server_name 127.0.0.1; #域名、或者ip
ssl_certificate cert/2974467.pem; #证书路径
ssl_certificate_key cert/2974467.key; #key路径
ssl_session_cache shared:SSL:1m; #储存SSL会话的缓存类型和大小
ssl_session_timeout 5m; #会话过期时间
ssl_ciphers HIGH:!aNULL:!MD5; #为建立安全连接,服务器所允许的密码格式表
ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
location / {
proxy_pass http://127.0.0.1;
}
}
安全配置
-
隐藏nginx版本号
在http 或者server下添加这个指令 server_tokens off; 隐藏nginx 版本号。经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞。
-
开启https
参照上边部分
-
开启黑、白名单配置
通过上边限制ip和允许指定ip的手段。
-
账号认证
这个就需要借助nginx的ngx_http_auth_basic_module模块
5、消除目录浏览漏洞
nginx默认不允许目录浏览,请检查目录浏览的相关配置,确保没有目录浏览漏洞:检查各个配置文件,确保autoindex的配置为off。
.....