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