nginx
安装
利用包管理工具(简单)
源码编译安装(灵活,但参数配置比较复杂)
开启,关闭,重载
/etc/init.d/nginx start
# kill -s signal pid(by default to the nginx.pid in the directory /usr/local/nginx/logs or /var/run) nginx -s signal
stop 快速关闭
quit 从容关闭
reload 重载配置文件
reopen 从新打开日志文件
配置文件所在路径
/usr/local/etc/nginx
/etc/nginx
orusr/local/nginx/conf
日志文件所在路径
/usr/local/nginx/logs
or/var/log/nginx
配置文件的基本结构
注释:以
#
开头,换行符结尾指令:名字+参数,以
;
结尾指令集:名字+用
{}
包围的多条指令,可嵌套
服务静态内容
http { server { location / { root /home/fengjun/data/www; } # 匹配最长前缀匹配原则 location /images/ { root /home/fengjun/data; } } }
设置简单的代理服务器
http { server { listen 8080; root /home/fengjun/data/www; location / { } } server { location / { proxy_pass http://localhost:8080; } } }
构建 FastCGI 代理
FastCGI servers是一种由各种各样的框架和编程语言(比如说PHP)构建的一种运行程序
http { server { # ~ 该修饰符使用区分大小写的正则表达式匹配 location ~ \.(php)$ { fastcgi_pass localhost:9000;(fastcgi_pass unix:/tmp/php-cgi.sock;) fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; include fastcgi_params; } } }
跨域
同源策略:浏览器上为安全性考虑实施的非常重要的安全策略。在这个策略下,web浏览器允许第一个页面的脚本访问第二个页面里的数据,但是也只有在两个页面有相同的源时。源是由URI,主机名,端口号组合而成的。这个策略可以阻止一个页面上的恶意脚本通过页面的DOM对象获得访问另一个页面上敏感信息的权限。
URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源
对比URL | 结果 | 分析 |
---|---|---|
http://www.cnblogs.com/a.js http://www.a.com/a.js | 不同源 | 不同域名 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同源 | 同一域名下不同文件夹 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 不同源 | 同一域名,不同端口 |
http://www.a.com/a.js https://www.a.com/b.js | 不同 | 同一域名,不同协议 |
http://www.a.com/a.js http://70.32.92.74/b.js | 不同源 | 域名和域名对应ip |
http://www.a.com/a.js http://script.a.com/b.js | 不同源 | 主域相同,子域不同 |
http://www.a.com/a.js http://a.com/b.js | 不同源 | 同一域名,不同二级域名 |
利用nginx解决跨域问题
# ^~ 该修饰符优先与正则表达式的匹配 location ^~ /proxy/{ rewrite ^/proxy/(.*)$ /$1 break; proxy_pass http://localhost:8888/; }
nginx的负载均衡
负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据''均匀"分摊到多个操作单元上执行
nginx提供的一些负载均衡的方法
轮询调度
//假设有一组服务器S = {S0, S1, …, Sn-1},一个指示变量i表示上一次选择的,n>0,W(Si)表示服务器Si的权值 i=n-1; j=i; do{ j=(j+1)mod n; if( W(j)>0 ){ i=j; return i; } }while(j!=i)
最少连接数调度
//假设有一组服务器S = {S0, S1, ..., Sn-1},C(Si)表示服务器Si的当前连接数 for (m = 0; m < n; m++){ for (i = m+1; i < n; i++) { if (C(Si) < C(Sm)) m = i; //找最小值需要两重for循环? } return m; } return NULL;
目标地址散列调度
//假设有一组服务器S = {S0, S1, ..., Sn-1},W(i)表示服务器Si的权值,ServerNode[]是一个Hash表,此表大小就是服务器的数目 n = ServerNode[hashkey(dest_ip)]; if ( (n is dead) || (W(n) == 0) ) return NULL; return n;
基本的负载均衡配置
#当没有明确指出负载均衡的调度算法的时候,默认是使用轮询调度 http { upstream myapp1 { #least_conn 最少连接数调度 #ip_hash 目标地址散列调度 server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } }
权重:如果没有特别指出每个服务器的权重,那么对于一种特定的调度,每一个服务器将会被平等的对待
#在这种配置下,如果有5个请求,srv1会被分配3个,srv2会被分配1个,srv3会被分配1个 upstream myapp1 { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; }
健康检查:当一个服务器响应失败,nginx会标记它,在一定的时间内,nginx会避免再次从服务器集里选择它来发起请求