花了一周时间了解nginx相关的知识,主要内容有:
基础知识: Nginx的快速部署安装、模块、基础配置语法,Nginx的日志输出、Nginx默认配置模块、Nginx做为http代理服务,介绍代理服务的类型,正向反向代理配置,nginx作为的应用层负载均衡服务的各种应用,hash负载均衡策略,Nginx缓存,
高级知识: Nginx常用配置模块,rewirte的配置语法和规则,配置基于指定地域的规则访问,geoip模块、https的实现原理,配置nginx的https服务,secure_link_module的防盗链实现,讲解,讲解Lua的开发语法、配合Nginx实现高效的认证系统和其他场景。
架构方面:Nginx常见问题和排错经验,实践应用场景中的方法处理Nginx安全,常见的应用层安全隐患,复杂访问控制,Nignx的sql防注入安全策略,Nginx的整体配置,搭建合理Nginx中间件架构配置步骤、策略Nginx性能优化:架构优化,操作系统优化、Nginx优化等…
基础知识
环境
初始环境
docker启动
docker run -d -p 8088:80 --name nginx_8088 nginx_80:latest /sbin/init
四项确认
确认系统网络(ping)
确认yum可用 (yum list | grep gcc
确认关闭iptables (iptables -F)
确认停用selinux
两项安装
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim
一次初始化
mkdir -pv /opt/{app,download,logs,work,backup}
nginx安装
确定nginx源
vim /etc/yum.repos.d/nginx.repo 添加: [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
安装
yum list | grep nginx yum install nginx
查看版本
nginx -v
查看nginx 编译的参数
nginx -V
nginx启动
nginx -c /etc/nginx/nginx.conf
重启nginx服务
systemctl restart nginx.service
柔和重启
nginx -s reload -c /etc/nginx/nginx.conf
检查配置文件
nginx -t -c /etc/nginx/nginx.conf
中间件架构
nginx简述
nginx是一个开源且高性能、可靠的http中间件,代理服务。
Nginx(发音同engine x)是一个 Web服务器,也可以用作反向代理,负载平衡器和 HTTP缓存。
该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。
为什么选择nginx
io多路复用epoll
多个描述符的i/o操作都能在一个线程内并发交替地顺序完成,这就教i/o多路复用,这里的”复用“指的是复用同一个线程。i/o多路复用的实现方式为:select、poll、epoll
什么是select
epoll模型
当FD就绪,采用系统的回调函数之间将fd放入,效率更高
最大连接无限制
轻量级
功能模块少
代码模块化
cpu亲和(affinity)
是一种cpu核心和nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能。
说白了就是减少cpu切换所损耗的性能
sendfile
nginx版本
Mainline version 开发版
Stable version 稳定版
Legacy version 历史版本
基本参数使用
rpm
rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。
安装目录
列出服务的安装目录
/etc/logrotate.d/nginx /etc/nginx /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/fastcgi_params /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/mime.types /etc/nginx/modules /etc/nginx/nginx.conf /etc/nginx/scgi_params /etc/nginx/uwsgi_params /etc/nginx/win-utf /etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /usr/lib64/nginx /usr/lib64/nginx/modules /usr/libexec/initscripts/legacy-actions/nginx /usr/libexec/initscripts/legacy-actions/nginx/check-reload /usr/libexec/initscripts/legacy-actions/nginx/upgrade /usr/sbin/nginx /usr/sbin/nginx-debug /usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz /usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html /var/cache/nginx /var/log/nginx
目录解释
路径 | 类型 | 作用 |
---|---|---|
/etc/logrotate.d/nginx | 配置文件 | nginx日志轮转,用于logrotate服务的日志切割 |
/etc/nginx /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/nginx.conf |
目录、配置文件 | nginx主配置文件 |
/etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params |
配置文件 | cgi配置相关,fastcgi配置 |
/etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf |
配置文件 | 编码映射转化文件 |
/etc/nginx/mime.types | 配置文件 | 设置http协议的Content-Type与扩展名对应关系 |
/etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service |
配置文件 | 用于配置出系统守护进程管理器管理方式 |
/etc/nginx/modules /usr/lib64/nginx/modules |
目录 | nginx模块目录 |
/usr/sbin/nginx /usr/sbin/nginx-debug |
命令 | nginx服务的启动管理的终端命令 |
/usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz |
文件目录 | nginx的手册和帮助文件 |
/var/cache/nginx | 目录 | nginx的缓存目录 |
/var/log/nginx | 目录 | nginx的日志目录 |
编译参数
列出编译参数的命令
nginx version: nginx/1.12.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/etc/nginx \ --sbin-path=/usr/sbin/nginx \ --modules-path=/usr/lib64/nginx/modules \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --http-client-body-temp-path=/var/cache/nginx/client_temp \ --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=/var/cache/nginx/scgi_temp \ --user=nginx --group=nginx \ --with-compat \ --with-file-aio \ --with-threads \ --with-http_addition_module \ --with-http_auth_request_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_mp4_module \ --with-http_random_index_module \ --with-http_realip_module \ --with-http_secure_link_module \ --with-http_slice_module \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_sub_module \ --with-http_v2_module \ --with-mail \ --with-mail_ssl_module \ --with-stream \ --with-stream_realip_module \ --with-stream_ssl_module \ --with-stream_ssl_preread_module \ --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong \ --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \ --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
参数解释
路径 | 类型 |
---|---|
–prefix=/etc/nginx –sbin-path=/usr/sbin/nginx –modules-path=/usr/lib64/nginx/modules –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock |
安装目的目录或路径 |
–http-client-body-temp-path=/var/cache/nginx/client_temp –http-proxy-temp-path=/var/cache/nginx/proxy_temp –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp –http-scgi-temp-path=/var/cache/nginx/scgi_temp |
执行对应模块时,nginx所保留的临时性文件 |
–user=nginx –group=nginx | 设定nginx进程启动的用户和组用户 |
–with-cc-opt=parameters | 设置额外的参数将被添加到CFLAGS变量 |
–with-ld-opt=parameters | 设置附加的参数,链接系统库 |
nginx基本配置语法
http相关
展示每次请求的请求头
curl -v http://www.baidu.com
结果
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* About to connect() to www.baidu.com port 80 (#0) * Trying 61.135.169.121... * Connected to www.baidu.com (61.135.169.121) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: www.baidu.com > Accept: */* > < HTTP/1.1 200 OK < Server: bfe/1.0.8.18 < Date: Thu, 30 Nov 2017 02:14:02 GMT < Content-Type: text/html < Content-Length: 2381 < Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT < Connection: Keep-Alive < ETag: "588604c4-94d" < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform < Pragma: no-cache < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/ < Accept-Ranges: bytes < { [data not shown] 100 2381 100 2381 0 0 88266 0 --:--:-- --:--:-- --:--:-- 91576 * Connection #0 to host www.baidu.com left intact
nginx日志类型
error.log、 access.log
log_format
格式
syntax: log_format name [escape=default | json] string...; default: log_format combined "..."; context:http
nginx变量
nginx配置的内容
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
变量类型
http请求变量:arg_PARAMETER,http_header,sent_http_header
内置变量:nginx内置的
自定义变量: 自己定义
nginx模块
nginx官方模块
第三方模块
default.conf
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
nginx开启的模块
--with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module
安装编译模块
编译选项 | 作用 |
---|---|
–with-http_stub_status_module | nginx的客户端状态 |
–with-http_random_index_module | 目录中选择一个随机主页 |
–with-http_sub_module | http内容替换 |
–limit_conn_module | 连接频率限制 |
–limit_req_module | 请求频率限制 |
http_access_module | 基于ip的访问控制 |
http_auth_basic_module | 基于用户的信任登录 |
http_stub_status_module 配置
配置语法
syntax: stub_status; default:- context:server, location
在default.conf中添加:
# my config location /mystatus { stub_status; }
检查和重新启动配置
nginx -tc /etc/nginx/nginx.conf
重启服务
nginx -s reload -c /etc/nginx/nginx.conf
检查效果
输入:http://127.0.0.1:8088/mystatus
表示nginx的活跃连接数;握手的总次数、处理连接数;读、写、等待个数
http_random_index_module
配置语法
syntax: random_index on | off; default:random_index off; context:location
在default.conf中将下面的配置:
location / { root /usr/share/nginx/html; index index.html index.htm; }
改为:
location / { root /usr/share/nginx/html; random_index on; #index index.html index.htm; }
重启后多刷几次网页:
主页出现不同了。
http_sub_module (替换)
配置语法
syntax: sub_filter string replacement; default:- context:http,server,location
syntax: sub_filter_last_modified on | off (重要用户缓存) default:sub_filter_last_modified off; context:http,server,location syntax: sub_filter_once on | off default:sub_filter_once on; context:http,server,location
是否只替换一次
连接限制
压力测试
ab -n 50 -c 20 http://127.0.0.1/index.html
-n 表示请求次数
-c 表示并发数
配置语法
连接限制
syntax: limit_conn_zone key zone=name:size; default:- context:http
syntax:limit_conn zone number; default:- context:http, server, location
请求限制
syntax: limit_req_zone key zone=name:size rate=rate; default:- context:http syntax: limit_req_zone name [burst=number] [nodelay]; default:- context:http,server,location
在default.conf中将下面的配置:
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } # my config location /mystatus { stub_status; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
改为:
limit_conn_zone $binary_remote_addr zone=conn_zone:1m; limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; #limit_conn conn_zone 1; limit_req zone=req_zone; # limit_req zone=req_zone burst nodelay; # limit_req zone=req_zone burst nodelay; index index.html index.htm; } # my config location /mystatus { stub_status; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #}
压测结果
限制前
限制后
http_access_module
配置语法
syntax: allow address | CIDR | unix: | all default:- context:http,server,location,limit_except syntax:deny address | CIDR | unix: | all default:- context:http, server, location ,limit_except
测试
配置如下
location ~ ^/admin.html { root /opt/app/code; deny all; index index.html index.htm; }
结果
局限性
http_x_forwarded_for
http_x_forwarded_for = client ip, proxy(1)ip,proxy(2)ip,…
解决方法
采用别的http头信息控制访问,如http_x_forward_for
结合geo模块操作
通过http自定义变量传递
http_auth_basic_module
配置语法
syntax: auth_basic string | off; default:- context:http,server,location,limit_except
syntax:auth_basic_user_file file; default:- context:http, server, location ,limit_except
生成password文件
htpasswd -c ./auth_conf wujunqi
修改conf文件
location ~ ^/admin.html { root /opt/app/code; auth_basic "please input you user name and passwd"; auth_basic_user_file /etc/nginx/auth_conf; index index.html index.htm; }
测试
局限性
用户信息依赖文件方式
操作管理机械、效率低下
解决方案
nginx 结合LUA实现高效验证
nginx和LDAP打通,利用nginx-auth-ldap模块
场景实践
静态资源web服务
静态资源
定义
非服务器动态生成的文件
静态资源服务场景-CDN
文件读取配置
sendfile
syntax: sendfile on | off; default:sendfile off context:http,server,location,if in location
注
–with-file-aio异步文件读取
tcp_nopush
作用:sendfile 开启的情况下,提高网络包的传输效率(等待,一次传输)
syntax:tcp_nopush on | off default:tcp_nopush off context:http, server, location
相反的
syntax:tcp_nodelay on | off default:tcp_nodelay on context:http, server, location
作用
在keepalive连接下,提高网络包的传输实时性
压缩
作用
压缩传输
syntax:gzip on | off default:gzip off context:http, server, if in location syntax:gzip_comp_level level; default:gzip_comp_level 1; context:http, server, location
扩展nginx压缩模块
http_gzip_static_module:预读gzip功能
http_gunzip_module: 应用支持gunzip的压缩方式
配置截图
浏览器缓存
http协议定义的缓存机制(如:expires,cache-control 等)
浏览器无缓存
浏览器有缓存
检测过期机制
作用 | 请求头 |
---|---|
检验是否过期 | expires, cache-control (max-age) |
协议中Etag头信息校验 | etag |
last-modified 头信息校验 | last-modified |
浏览器请求服务器过程(缓存版本)
相关配置
expires
添加cache-control、expires头
syntax: expires [modified] time; expires epoch | max | off; default: expires off; context:http, server, location
配置例子
跨域访问
为什么浏览器禁止跨域访问
不安全,容易出现CSRF***
nginx配置
syntax: add_header name value [always] default: - context:http, server, location, if in location
添加请求头:Access-Control-Allow-Origin
配置截图
防盗链
目的
防止资源被盗用
防盗链设置思路
首要方式:区别哪些请求是非正常的用户请求
基于http_refer防盗链配置模块
syntax: valid_referers none | blocked | server_names | string...; default: - context:server, location
配置截图
none:表示如果没带refer
blocked:代表不是标准的http写过过来的
一个命令
curl -e "http://www.baidu.com" -I http://116.62.103.228/wei.png
-e:表示refer
-i:表示只显示请求头
代理服务
代理-代为办理(代理理财、代理收货等)
代理服务
代理区别
区别在于代理的对象不一样
正向代理的对象是客户端
反向代理代理的是服务器
正向代理
反向代理
代理的配置
syntax: proxy_pass URL; default: - context:location, if in location, limit_except
url一般为:
http://localhost:8000/uri/
https://192.168.1.1:8000/uri/
http://unix:/tmp/backend.socket:/uri/;
反向代理配置截图
想访问8080,只能访问到80,通过80然后通过反向代理可以访问到8080
正向代理配置截图
116.62.103.228的配置如下(其实和反向代理配置参不多)
客户端配置
缓存区配置
syntax: proxy_buffering on | off default: proxy_buffering on context:location,http,server
扩展
proxy_buffer_size
proxy_buffers
proxy_busy_buffers size
跳转重定向配置
syntax: proxy_redirect default;proxy_redirect off;proxy_redirect redirect replacement; default: proxy_redirect default; context:location,http,server
头信息配置
syntax: proxy_set_header field value; default: proxy_set_header host $proxy_host proxy_set_header connection close; context:location,http,server
超时配置
syntax: proxy_connect_timeout time; default: proxy_connect_timeout 60s; context:location,http,server
扩展
proxy_read_timeout
proxy_send_timeout
总的配置
负载均衡调度器 SLB
nginx负载均衡
GSLB
GSLB 是英文Global Server Load Balance的缩写,意思是全局负载均衡。作用:实现在广域网(包括互联网)上不同地域的服务器间的流量调配,保证使用最佳的服务器服务离自己最近的客户,从而确保访问质量。
SLB
负载均衡(Server Load Balancer,简称SLB)是一种网络负载均衡服务,针对阿里云弹性计算平台而设计,在系统架构、系统安全及性能,扩展,兼容性设计上都充分考虑了弹性计算平台云服务器使用特点和特定的业务场景。
4层负载均衡
在iso模型中的传输层(包的转发)
7层负载均衡
在应用层实现
nginx实现的负载均衡(7层)
配置
syntax: upstream name{...} default: - context:http 配置截图
upstream举例
upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.exmple.com:8080 backup; server backup2.example.com:8080 backup; }
后端服务器在负载均衡调度中的状态
字段 | 作用 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后,服务暂停的时间 |
max_conns | 限制最大的接收的连接数 |
配置截图
调度算法
字段 | 作用 |
---|---|
轮询 | 按时间顺序逐一分配到不同的后端服务器 |
加权轮询 | weight值越大,分配到的访问几率越高 |
ip_hash | 每个请求按访问ip的hash结果分配,这样来自同一个ip的固定访问一个后端服务器 |
least_conn | 最少链接数,那个机器连接数少就分发 |
url_hash | 按照访问的url的hash结果来分配请求,是每个url定向到同一个后端服务器 |
hash关键值 | hash自定义的key |
iphash
url——hash
配置语法
url_hash
syntax: hash key [consistent]; default:- context:upstream this directive appeared in version 1.7.2
配置截图
动态缓存
缓存的类型
代理缓存
proxy_cache配置语法
syntax: proxy_cache_path path [levels=levels] Default:- context:http
开关
syntax: proxy_cache zone | off; default:proxy_cache off; context:http, sercer, location
过期周期
syntax: proxy_cache_valid[code] time; default:- context:http, sercer, location
缓存的维度
syntax: proxy_cache_key string; default: proxy_cache_key $scheme$proxy_host$request_uri; context:http,server,location
配置截图
level:目录分级
inactive:不活跃就清理
如何清理指定缓存
rm-rf缓存目录内容
第三方扩展模块ngx_cache_purge
如何让部分页面不缓存
syntax : proxy_no_cache string ...; default: -; context:http,server,location
配置截图
大文件分片请求
syntax : slice size default: slice o context:http,server,location
http_slice_module
优势
每个子请求收到的数据都会形成一个独立的文件,一个请求断了,其它请求不受到影响
缺点
当文件很大或者slice很小的时候, 可能会导致文件描述符耗尽等情况。
深度学习
动静分离
通过中间件将动态请求和静态请求分离
为什么
分离资源,减少不必要的请求消耗,减少请求延时
场景
rewrite规则
应用场景
url访问跳转,支持开发设计
页面跳转、兼容性支持、展示效果等
seo优化
维护
后台维护、流量转发
安全
配置语法
syntax: rewrite regex replacement [flag]; default:- context:server, location,if
维护页面实例
rewrite ^(.*)$ /pages/maintain.html break;
flag
字段 | 作用 |
---|---|
last | 停止rewrite检测 |
break | 停止rewrite检测 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址(浏览器下次直接访问重定向后的地址 |
一些实例
rewrite规则优先级
执行server块的rewrite指令
执行location匹配
执行指定的locaiton中的rewrite
nginx高级模块
secure_link_module模块
制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问。
限制链接生效周期
syntax: secure_link expression default:- context:server, location,server
syntax: secure_link_md5 expression default:- context:server, location,http
图示
配置例子
http_geoip_module使用场景
基于ip地址匹配MaxMind GeoIp 二进制文件,读取ip所在地域信息
yum install nginx-module-geoip
区别国内外做http访问规则
区别国内城市地域做http访问规则
配置截图
https服务
对传输内容进行加密以及身份验证。
为什么需要https
传输数据被中间人盗用,信息泄露
数据内容劫持,篡改
对称加密和非对称加密
https加密协议原理
中间人伪造客户端和服务器
如何解决
生成密钥和CA证书
安装openssl和http_ssl_module模块
#openssl version openSSL 1.0.1e-fips 11 feb 2013 #nginx -V --with-http_ssl_module
步骤
生成key密钥
openssl genrsa -idea -out jesonc.key 1024
结果
生成证书签名请求文件(csr文件)
openssl req -new -key jesonc.key -out jesonc.csr
结果
生成证书签名文件(CA文件)
openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
结果
相关实验
配置docker(443)
docker run -d -p 443:443 --name nginx_443 nginx_443:latest /sbin/init nginx -c /etc/nginx/nginx.conf
conf文件配置
server { listen 443; server_name localhost; ssl on; ssl_certificate /etc/nginx/ssl_key/jesonc.crt; ssl_certificate_key /etc/nginx/ssl_key/jesonc.key; location / { root /usr/share/nginx/html; #limit_conn conn_zone 1; #limit_req zone=req_zone; # limit_req zone=req_zone burst nodelay; # limit_req zone=req_zone burst nodelay; index index.html index.htm; } # my config location /mystatus { stub_status; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
测试结果
https服务优化
激活keepalive长连接
设置ssl session缓存
配置截图
Nginx架构
以后补上
摘自:http://fanqieto.top/2017/11/29/nginx%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/