- 内置变量
$host:请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称
$http_HEADER: HTTP请求头中的内容,HEADER为http请求中的内容转为小写,-变为_。例如:$http_user_agent(User-Agent的值)
$remote_addr: 客户端的IP地址
$remote_port: 客户端的端口
$request_method: 这个变量是客户端请求的动作,通常为GET或POST
$request_uri: 这个变量等于包含一些客户端请求参数的原始URI
$scheme: 所用的协议,比如http或者Https
$server_name: 服务器名称
$server_port: 请求到达服务器的端口号
$server_protocol: 请求使用的协议,通常是HTTP/1.0或者HTTP/1.1
$uri: 请求中的当前URI(不带请求参数,参数位于$args)
$http_origin: 浏览器携带的origin头
-
if语句(没有else)
- 常用正则:
=, != 比较的一个变量和字符串 ~, ~* 与正则表达式匹配的变量,如果这个正则表达式中包含 -f, !-f 检查一个文件是否存在 -d, !-d 检查一个目录是否存在 -e, !-e 检查一个文件,目录,符号链接是否存在 -x, !-x 检查一个文件是否可执行
- 示例
静态资源:location ~ /rex/.*\.(html|js|css)$ 域名校验:if($http_origin ~ http:/ /(.*).enjoy.com) 浏览器校验:if($http_user_agent ~ Firefox)
-
浏览器的跨域问题
-
解决跨域的方式:
1)JSONP
2)domain+iframe
3)Nginx配置if($http_origin ~ http://(.*).enjoy.com){ set $allow_url $http_origin; } #是否允许请求带有验证信息 add_header Access-Control-Allow-Credentials true; #允许跨域访问的域名,可以是一个域的列表,也可以是通配符*。最主要的点,其他可不配置 add_header Access-Control-Allow-Origin $allow_url #允许脚本访问的返回头 add_header Access-Control-Allow-Headers 'x-request-with,content-type,Cache-Control,Pragma,Date,x-time-stamp' #允许使用的请求方法,以逗号隔开 add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE'; #允许自动的头部,以逗号隔开,大小写不敏感 add_header Access-Control-Expose-Headers 'www-Authenticate,Server-Authorization'; #p3p支持跨域cookie操作 add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
-
-
防盗链
- valid_referers: 匹配域名白名单,如果不匹配,把内置变量$invalid_referer设置为1
- 示例
location ^~ /mall{ valid_referers *.enjoy.com; if($invalid_referer){ return 404; } root html/gzip; }
-
缓存与压缩
- 缓存 :expries liveTime
- 压缩
location ~ /(.*)\.(html|js|css) { gzip on; #启用gzip压缩,默认不启用 gzip_types application/javascript text/css image/jpeg image/png; #对哪些格式进行压缩 gzip_min_length 1024; #所压缩文件的最小值,小于这个的不会压缩 gzip_buffers 4 1k; #设置压缩响应的缓冲块的大小和个数,默认是内存一个页的大小 gzip_comp_level 1; #压缩水平,默认1.取值范围1-9,取值越大压缩比率越大,但越耗CPU时间 root html/gzip; }
-
https
- 生成证书(不能用于生产,生产一般都是通过购买)
1)创建服务器私钥,命令会让你输入一个口令: openssl genrsa -des3 -out server.key 1024 2)创建签名请求的证书(CSR) openssl req -new -key server.key -out server.csr 3)在加载SSL支持的Nginx并使用上述私钥时出去必须的口令: openssl rsa -in server.key -out server_nopass.key 4)最后标记证书上使用上述私钥和CSR: openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt
- conf文件中
ssl_certificate /etc/nginx/conf.d/server.crt; ssl_certificate_key /etc/nginx/conf.d/server_nopass.key;
- nginx -V 查看安装的Nginx环境,检查是否安装openssl
- 有https方式之后,对http请求重定向,使所有的请求都使用https
rewrite ^/ https:/ /sales.enjoy.com redirect;
- 配置https后ajax请求普通http,会报错。解决办法是对请求的服务器配置https
-
nginx的高可用--keepalived
- LVS思想--虚拟网关
- keepalived的思路,由2台服务器软件虚拟出来一台虚拟网关vip,此vip由两台机器共同协商生产,当有一台宕机时,另一台机器一样能维持vip,这保证了,只要两台机器不同时宕机,vip就一直存在
- keepalived的安装,使用以及应用到nginx的集群步骤如下:
1)centos6的keepalived下载地址:https://pan.baidu.com/s/1G7sLL-YKZGSMu8G76yz1Rw 密码:adbw 2)安装步骤 1>./configure --prefix=/data/program/keepalived --sysconf=/etc ## 因为keepalive启动时候会默认读取/etc/keepalived/keepalived.conf 2>make && make install 3)修改/etc/keepalived/keepalived.conf配置文件信息 4)启动keepalived /data/program/keepalived/sbin/keepalived 5)keepalived主从故障测试 启停主从keepalived,查看对应的vip=192.168.244.200 6)加nginx监控脚本 停止nginx,观察keepalived自动拉起nginx服务 7)查看keepalived日志: tail -f /var/log/messages 8)配置: global_defs{ #全局配置 router_id nginx_backup #表示运行keepalived服务器的一个标识,唯一的 } vrrp_script chk_http_port{ script "/usr/local/src/chk_nginx_pid.sh" #心跳执行的脚本 interval 2 #检测脚本执行的间隔,单位是秒 weight 2 } vrrp_instance VI_1{ #vrrp实例定义部分 state BACKUP #指定keepalived的角色,MASTER为主,BACKUP为备 interface eth0 #当前进行vrrp通讯的网络接口卡(当前centos的网卡) virtual_router_id 66 #虚拟路由编号,主从要一致 priority 100 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 #检查间隔,默认为1s(vrrp组播周期秒数) authetication{ auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } track_script{ chk_http_port #调用检测脚本 } virtual_ipaddress{ 192.168.244.200 #定义虚拟Ip(VIP),可多设,每行一个 } } 9)启动成功后,查看指定的网卡上的Ip判断虚拟ip是否成功。ip addr
- 监控Nginx的检测脚本,名字为上面使用到的chk_nginx_pid.sh
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #重启nginx if [`ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移 killall keepalived fi fi
- keepalived只能是2台机器之间
- keepalived主备之间相互发送心跳检测,如果一个死掉,另一个活的得不到回应了,此时启动vip到自己机器上。如果相互是通的,比较priority的优先级,值大的机器绑vip
- Nginx本身不支持集群,通常借助其他外部应用如当前说的keepAlived,而keepAlived也一般不会用在生产上。生产上一般可以使用域名对应多个Ip的操作,达到nginx高可用的效果