nginx

Nginx是俄罗斯人开发的
Nginx的概念:  web软件之一
高性能(处理并发好 所用模型是events(事件模型))
可以做反向代理服务器
  可以做基于七层的负载均衡
IMAP/POP3/SMTP服务器
Engine X
Nginx的特点:
跨平台,可以在大多数Unix like OS 编译运行
轻量级,C语言开发,系统开销低。10000并发占用2.5M内存
高并发,通信机制采用epoll的网络i/o模型(异步非阻塞)
由进程循环处理多个准备好的事件
代理功能强大,七层负载均衡
配置文件简介,正则表达式提高配置效率
Nginx的基础概念--master与worker
master
fork worker进程
 
 
 
安装
基本配置
发布默认网站
URL重写
限速
防盗链
虚拟主机
反向代理
lnmp
 
 
nginx是什么:
 
web软件
apache +php   处理动态页面有优势
nginx 处理静态页面有优势
 
负载均衡器(七层)upstream+反向代理
四层:   srp ip  dest ip   src port    dst port  tcp
七层:  四层+http     url、user_agent
 
邮件服务器   postfix
 
 
nginx的体系结构:
master 进程   worker进程
master:加载配置文件,建立socket(监听tcp 80),产生worker进程,分配客户端的请求(给worker进程)
worker:处理客户端的请求
 
worker进程中可以有多个线程(来处理http请求)。
 
 
nginx安装:
yum install gcc pcre-devel zlib-devel -y
./configure --prefix=/usr/local/nginx
make && make install
 
运行nginx:    
/usr/local/nginx/sbin/nginx
 
关闭nginx:
killall nginx
重新加载配置文件的方式:
重启nginx:   killall nginx;/usr/local/nginx/sbin/nginx    -->影响线上业务
信号: killall -s HUP nginx    -->不影响线上业务;缺点:如果配置文件有问题,仍然继续使用旧配置文件。
 
 
基本配置:
worker_processes  1; 指定有几个worker进程,进程数量=cpu核心数-1
nginx的工作模式,事件模型(进线程混合模型)     每一个http请求--->事件;
events {
     worker_connections  1024;         //一个worker进程能够处理多少个链接请求
}
 
Apache工作模式:  prefork   worker
 
http {
nginx功能实现区域(web/proxy/LB)
 
  location / { //location /    定义网站根目录   
             root   html; //root   定义根目录为什么目录     /usr/local/nginx/html
             index  index.html index.htm; //index  定义索引页(网站首页)名
        }
}
sed -i '/^$/d' /usr/local/nginx/conf/nginx.conf
sed -i '/#/d' /usr/local/nginx/conf/nginx.conf
 
发布网页:
 
虚拟主机:
 
一个server即一个网站
 
 
基于域名
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.xx.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  www.jj.com;
        location / {
            root   www;
            index  index.html index.htm;
        }
    }
}
 
基于ip
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       192.168.19.248:80;
        server_name  www.xx.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       192.168.19.249:80;
        server_name  www.jj.com;
        location / {
            root   www;
            index  index.html index.htm;
        }
    }
}
 
 
基于端口
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.xx.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       8080;
        server_name  www.jj.com;
        location / {
            root   www;
            index  index.html index.htm;
        }
    }
}
 
 
url重写
nginx收到的http请求中的URL被改写
 
客户端 247 www.xx.com/
nginx_web   248           --> 192.168.19.251/cc/index.html
apache_web  251
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.xx.com;
        location / {
            #root   html;
            #index  index.html index.htm;
                rewrite  ^/$  http://192.168.19.251/cc/index.html;
        }
    }
}
 
 
防盗链
客户端 247
nginx_web   248          
盗链_web  251
 
怎样判断有没有被其他机器盗链:
抓包 看请求头
访问日志
 
所有的盗链都需要被阻止码?
公司内部引用是可以的,其他公司服务器(域名/ip)就要被阻止
搜索引擎公司的盗链    也不用阻止
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.xx.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~* .(gif|jpe?g|png|swf|flv)$ {
                valid_referers  none  blocked  *.baidu.com;
                if ($invalid_referer) {
                        return  403;
                }
        }
    }
}
 
~  匹配xxx资源(图片)
* 不区分大小写
() 集合     |   或者
 
valid_referers 允许引用的(公司内部引用)
none 请求报文中没有referer字段的
blocked 通过防火墙的请求
*.baidu.com 允许百度服务器过来引用(盗链)
 
 
if 判断  
$invalid_referer 不被允许的
return  403    返回403代码
 
 
 
限速(下载限速)
一开始就限速
limit_rate      100k;
 
 
同一个客户端最多同时开3个下载链接
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone  $binary_remote_addr  zone=vfast:300k;
    server {
        listen       80;
        server_name  www.xx.com;
        location / {
            root   html;
            index  index.html index.htm;
                limit_conn vfast 3;
                limit_rate_after        90m;
                limit_rate      100k;
        }
    }
}
 
 
反向代理
客户端   247
nginx反向代理服务器     248
apache_web: 251  
 
客户端先三次握手跟反向代理服务器建立tcp链接,然后发出http请求;代理服务器在三次握手跟源服务器建立tcp链接,并发出http请求。
客户端的一个链接请求对于代理服务器来说,需要建立几个tcp链接---2个
 
对于源服务器来说,客户端是代理服务器。那么就意味着源服务器不知道真正的客户端是谁。DOS   
让源服务器了解真正的客户端是谁!!!
 
 
 
1、将反向代理服务器收到的请求包添加两个头域
proxy_pass      http://192.168.19.251;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
2、后端rs如果是apache,默认访问日志不记录真正的客户端,需要修改apache访问日志的日志格式
LogFormat "%{X-Forward-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 
 
lnmp   网站发布架构L A M P     php  5.4     factCGI     php服务   php-fpm    9000
  L  N  M P    -->nginx   web角色
 
写一个动态页面,通过lnmp将页面发布出去     php  时间
php做成服务    
 
 
5.4之后的php,使用php-fpm做成服务
5.4之前的php,使用spawn-fcgi做成服务
安装:
 
yum install php-*  mysql-server mysql -y
vim conf/nginx.conf
 location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/$fastcgi_script_name;
            include        fastcgi_params;
        }
 
 
[root@19_248 nginx_install]# rpm -ivh spawn-fcgi-1.6.3-1.el5.i386.rpm
spawn-fcgi
-f 指定fastCGI程序文件名,即php-cgi执行程序  /usr/bin/php-cgi
-a 指定绑定到的ip地址
-p port端口号
-C 产生php子进程的数量
-P spawn进程的pid文件
-u user
-g group
开启php服务:监听9000端口
[root@19_248 html]# spawn-fcgi -a 127.0.0.1 -p 9000 -u nobody  -g nobody -C 5 -P /var/run/spawn.pid -f /usr/bin/php-cgi
 
 
客户端发出http请求发给nginx_web(url  /index.php)-->nginx根据配置文件的设置,将该请求交给127.0.0.1:9000这个程序(php-cgi),php解析客户单的请求并执行响应的脚本(index.php)-->返回给客户端
 
 
 
 nginx_day2
 
 
nginx最大连接数
worker进程与CPU核心绑定
压缩
缓存
 
tomcat发布JSP网页
tomcat多实例
 
nginx负载均衡
 
 
nginx最大连接数
web软件
反向代理服务器
 
系统限制,nofile(open files  一个程序最大可以打开的文件数量)默认是1024,意味着Apache最大可以处理1024个连接。通过ulimit -SHn 65535可以修改这个值为65535.永久设置去编辑/etc/rc.local
nginx工作模型:
 
nginx做为web软件能够承担的最大连接数量:worker_processes*worker_connections
nginx作为反向代理服务器能够承担的最大连接数量:worker_processes*worker_connections/2
 
 
worker进程与CPU核心绑定
处理请求更快
cpu0     1 2 3 4 5 6 7 8 9     同一时间CPU只能处理一个进程  
cpu1 worker
cpu2 worker
cpu3
。。。
cpu15
worker进程数量=cpu核心数-1
[root@19_248 nginx]# cat /proc/cpuinfo
 
查看进程跑在那一个cpu核心上:
ps -eo psr,cmd | grep nginx
 
-eo: 自定义ps命令的输出格式
psr: 显示cpu核心编号
cmd: 产生进程的命令
1、配置文件
worker_processes  3;
worker_cpu_affinity
1000
0100
0010;
2、独立cpu核心
Vim /boot/grub/grub.conf
kernel ... isolcpus=1,2,3
 
3、reboot
 
压缩
节省出口带宽
    gzip  on;
    gzip_http_version 1.1; //http协议的版本,1.1版本支持压缩
    gzip_disable "MSIE[1-6]."; //客户端使用的浏览器是微软1-6版本时,不压缩
    gzip_types  text/plain application/octet-stream; //什么样的数据会被压缩:明文字符串,二进制文件(图片、视频)
    gzip_min_length 1024; //文件大小小于1k的不压缩
    gzip_comp_level 6; //压缩级别  6级别
    gzip_buffers 8 4k; //用8个4k的内存页来压缩,32k
 
 
缓存
expires 10m;  d   h  
 
 
tomcat   web软件      java     jsp网站  页面
好处: 安全     银行 证券金融,java
apache旗下的一款web软件     apache  +PHP       tomcat +jsp      apache   nginx  23
www.netcraft.com 某网站服务器系统、webserver   
 
php   lamp   lnmp
jsp ltmj       t---web  tomcat    j---处理jsp页面   java环境
 
 
安装:即解压
tar -xf  apache-tomcat....    -C  /srv
mv  .....   tomcat1
cd tomcat1/bin
./startup.sh        启动
 
netstat -tlunp | grep java     三个端口   8005  8009  8080
 
客户端访问:  
url    http://192.168.19.251:8080
 
 
tomcat的图形化管理工具
认证用户:
tomcat首页上点“Manager APP”-->在conf/tomcat-user.xml加入:
<role rolename="manager-gui"/>
<user username="tomcat" password="234" roles="manager-gui"/>
重启tomcat
 
通过nginx的URL重写,实现客户端直接访问到tomcat的首页
客户端-->nginx-->tomcat
nginx:
location / {
rewrite ^/$ http://192.168.19.251:8080;
}
 
tomcat多实例:
tomcat  单进程的程序,服务器多核心   16核心  tomcat
8005
8009
8080  
注意需要修改端口号conf/server.xml
 
 
 
tomcat发布jsp网站(图书管理系统)
1、看readme文件
# mysql
> create database bookmanage;
> show databases; //看一看有没有这个库
> use bookmanage; //使用这个库
> show tables; //看一下库中有没有表      没有
> exit
 
2、导入数据
# mysql -u root -p bookmanage < bookmanage.sql
 
3、把网页发布出去    
[root@19_251 tomcat1]# cd /usr/src/tomcat_vfast/bookmanage/
cp -r WebRoot /srv/tomcat1/webapps/book
 
4、客户端测试能不能访问到这个图书管理系统
URL: http://192.168.19.251:8080/book
 
www.xx.com -->图书管理系统
www.xx.com -->解析到nginx(url重写)-->http://192.168.19.251:8080/book
 
发布两个jsp网站:
tomcat1  -->图书管理系统     www.a.com
tomcat2  -->tomcat首页 www.b.com
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    gzip_http_version 1.1;
    gzip_disable "MSIE[1-6].";
    gzip_types  text/plain application/octet-stream;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_buffers 8 4k;
    server {
        listen       80;
        server_name  www.a.com;
        location / {
            root   html;
            index  index.html index.htm;
            rewrite ^/$ http://192.168.19.251:8080/book;
        }
        }
    server {
        listen       80;
        server_name  www.b.com;
        location / {
            root   html;
            index  index.html index.htm;
            rewrite ^/$ http://192.168.19.251:8090;
        }
    }
}
 
 
 
 
 
 
负载均衡
 
nginx作为负载均衡的高可用    lvs+keepalived     nginx+keepalived    vrrp
 
 
 
 
 
Nginx的负载均衡及高可用
   Nginx可以做基于 user-agent   URL 域名 动静分离  的负载均衡
 
手机的浏览器类型与(pc机和平板不同)  以安卓手机的浏览器最突出 
pc机和平板所用的浏览器类型一样
 
 
 
weight   权重
weight也是upstream的参数
参数
down 表示server(server表示rs)不可用
backup  表示为备用server  当所用的server都不可用后就会启用该server
 
 
 
 
 
 
 bc计算
Nginx里的哈西算法是根据ip的前三位
    ip_hash
 
 
jsp页面也是动态页面
 
 
 
基于客户端浏览器分发
 
 
 
基于域名的分发
 
 
基于geo的分发  
geo ip数据库
 
基于URL-hash算法    url-hash  主要应用在缓存服务器
最后加个;done
 
 
upstream和server平级
 
客户  Nginx rs  Nginx  客户
 
 
 
 
 
 
 
 
interval 间隔
instance 实例
dos2Unix   把Windows系统的格式转化成Unix的格式
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
实验:
  网络环境:
client         192.168.19.1
route  网卡1   192.168.19.2
route   网卡2  192.168.18.1
Nginx          192.168.18.2
rs1        192.168.18.3
    rs2            192.168.18.4
 
 
    1 :基于rr算法的Nginx负载均衡
      (1)进入Nginx的配置文件
           添加一个反向代理服务和一个upstream模块
        
       (2)重启Nginx
   (3)在客户端测试,能依次出现两个rs的内容就成功了
2 :基于wrr(加权轮询算法)的Nginx负载均衡
 
3 :基于ip_hash的Nginx负载均衡
注意:测试时需要不同网段的进行测试
4 :基于动静分离的Nginx负载均衡
  
5 :基于浏览器类型的Nginx负载均衡
6 :基于域名的Nginx负载均衡
7 :基于geo的Nginx负载均衡
8 :基于URL_hash的Nginx负载均衡
 
 
 
 
 
 
 
 
 
HA  高可用
实验
   client         192.168.19.1
route  网卡1   192.168.19.2
route   网卡2  192.168.18.1
Nginx          192.168.18.2
Nginx2 192.168.18.5
rs1        192.168.18.3
    rs2            192.168.18.4
 
1
 
 
posted @ 2018-05-04 21:12  零0零  阅读(341)  评论(0编辑  收藏  举报