如果是lvs,lvs只是把用户发来的请求数据包转到后端的服务器,后端的服务器看到是用户请求是来自于客户端
如果是nginx,nginx不是转发用户发来的请求,而是代替用户去后端的Apache服务器去访问,后端Apache服务器看到的用户请求是来自nginx服务器,这叫反向代理
支持高可用
支持热部署,不停机升级版本,新发起的请求,在新版本响应,如果是一个连接旧版本,就在旧版本响应,当旧的访问结束了,新发起的请求我们就可以连接新的版本。也加平滑升级
支持的模块 event-driven ,aio,mmap,sendfile
nginx是一个优秀的静态资源的web服务器,用来存放一些静态的页面
lnmp :linux nginx mysql php-fpm php-mysql 注:php-fpm是fastcgi
nginx充当的是fastcgi的客户端,nginx要监听fastcgi的9000端口
客户端连接nginx,nginx连接php-fastcgi,php-fastcgi连接php-mysql,php-mysql在连接mysql数据库
而子进程worker连接各种所需要的模块来处理用户请求,而处理请求时基于事件驱动模型能实现单进程处理多路请求,单个进程能处理连接数由worker kenaiks定义,而一共能启用的进程数只有worker_processes定义,二者的乘级就是他能处理的并发连接请求数量
nginx是一个master开多个worker,但是worker不多。但是每个worker可以并发支持很多人的访问,worker中没有线程,用的是I/O复用,
worker支持很多模块,每个模块有特定的功能,例如:web服务,代理服务,fastcgi
master和worker之间的关系:master管理worker进程,例如:销毁,会加载一个worker,平滑升级,都是master进程来负责的,master相当老板,用户发来请求,master不会提供服务
nginx支持反向代理:nginx可以将用户的请求调度到后端的web服务器,或者fastcgi服务器
nginx还支持缓存功能:用户将请求发给nginx,nginx可以缓存一份数据,下次用户访问就可以直接在缓存中响应请求,就不用到后端服务器去重新查找数据。nginx基于缓存加载,缓存管理的功能。这个缓存放在内存中也可能放在nginx磁盘里
Apache支持多http虚拟主机,不支持多https虚拟主机
nginx支持多https虚拟主机,因为nginx支持SNI
apache的并发只能达到10000,而nginx能轻松达到30000
select 跨平台,在linux实现了,也在windows支持
epoll :epoll比select有巨大的区别,因为epoll具有信号驱动I/O模型的某些特性
epoll和select的区别
select和epoll都可以面对多个用户的进程发请求,select和epoll相当代理人收集很多用户的请求过来,然后收集完成,select和epoll去帮你从磁盘上发数据,得到数据方复制到内核中,来得到相应的数据,但是这个数据有没有准备好,select和epoll的实现机制是不一样的
select和poll :遍历机制,一个一个的查找用户的数据是否准备好
epoll :回调机制:相当于异步的机制,具有信号的一些特性,因此,当你的数据准备好以后epoll会主动通知你,相对来讲epoll比select效率要高 。
select并发连接,接收的用户请求是1024个,poll的并发连接无上限
水平触发:如果是水平触发,是通知多次,这次数据没有准备好,在通知
边缘触发:只做一次的事,不分多次做,相对消耗资源少,边缘触发性能要更好
如果要安装新版本的nginx可以在nginx的官方网站,进行拷贝官方提供的yum源
ab -c 1000 -n 2000 http://172.20.127.169/
1.worker_processes auto; 根据CPU当前的情况自动定义worker的数量,最好和当前的CPU数量相等,例如:我们有两个cpu就有2个worker,但是并不是worker越多性能就越好,因为每开一个进程都要消耗CPU,如果开的进程多,消耗的CPU就越多。nginx的一个worker就可以并发支持多个用户的访问,所以nginx不是一个进程响应一个用户
2.我们可以将一个worker和一个CPU绑定,这样的好处是提高缓存的命中率,我们的CPU里面也有缓存,如果一个worker和cpu绑定在一起,这样CPU里面的缓存就可以一直被这个worker重复使用,如果不绑定就有可能带来问题,例如:支持跑在这个CPU,待会又可能跑在另一个CPU上,这样原来CPU上的缓存就将失效了,由此会反过来影响我们的性能
watch -n 0.5 'ps axo pid,cmd,psr |grep nginx'
例如有两个CPU,两个worker,我们将worker绑定在第一个和第二个CPU上
3.worker进程的优先级,worker优先级的 -20,19
watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是优先级
4.worker进程能打开的文件数量上限,支持多少个用户并发
worker_rlimit_nofile 30000; 代表worker的总值
5. events 事件驱动,我们在nginx用的是epoll模型
我们可以定义一个worker的并发连接是15000,两个worker的并发就是30000
6. accept_mutex on |off 互斥 处理新请求的方法
如果启用,如果有多个请求,第一个请求发送给第一个worker,第二个请求发送给第二个worker
如果不启用,如果来了一个请求,就都唤醒所有的worker,最后还是一个worker提供服务的
是否以守护进程方式运行,默认是守护进程,守护进程就是前台执行还是后台执行
是否以master/worker模型运行nginx,默认是on启用的
ngx_http_core_module 模块,模块中的指令
server 语句块,这个server语句块是放在http语句块里面的
我们可以建多个虚拟主机,建每个虚拟主机放在不同的.conf文件里面,方便管理
是否当用户发请求到http网站的时候,如果我们启用keepalived服务器状态监测模式,意味着用户发来请求不立即断开,可以继续发多个请求过来,一次tcp握手,可以连接多次请求
直接从磁盘把数据复制到内核空间,然后内核空间直接把数据复制到内核关于socket ba fe的缓冲区
server_tokens on |off | build |string
我们要在配置文件的http语句块里面设置,这样隐藏全部的版本号,如果想隐藏单独的虚拟主机我们可以虚拟主机的server里面设置
location:可以定义某个位置,根据这个位置来单独的做额外的处理
当我们访问news的url的时候,访问的是/data/sitea/
当访问url的news的上,访问的是/app/sitea/下news目录下的index.html
访问www.a.com 的根站点 /www/sitea/目录
alias 例如:当我们访问网站url的/bbs/目录时,得到的数据是来自于/web/forum/index.html
root 例如:当我们访问网站url的/bbs/目录时,的到的数据是来自于/web/forum/bbs/index.html
error_page_code 错误页面
如果访问的是一个不存在的页面,我们可以定义把报错转到我们定义的位置页面
如果404报错就将报错页面转到我们指定的/data/sitea/404.html/ 页面
当我们访问一个错误页面,我们将404响应改成200的响应码,我们看到的还是404报错的页面
try_files :当我们找一个内容,按照什么顺序去寻找顺序
try_files $uri /images/default.gif;
当访问/images/目录下的内容的时候,进到目录挨个找,先找$uri(xx.html),如果找不到就访问/images/default.gif默认页面
try_files $uri $uri/index.html $uri.html =404;
当访问根的时候,先找$uri,如果没有就找$uri $uri/index.html,如果还找不到,就找$uri.html并返回一个404页面
当访问images目录下的a.jpg就返回a.jpg,如果没有a.jpg就返回default.jpg
用于接收每个客户端请求报文的body部分的缓冲区大小,默认是16k,超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置。
limit_except method 只能用在location
限定客户端的请求方法
只能是内部管理员访问除了GET的其他方法,其他互联网用户都不能访问
ngx_http_access_module 控制用户谁能访问,谁不能访问
ngx_http_auth_basic_module 用户身份验证
htpasswd -cm nginxuser httpuser1 创建用户httpuser1,第一次创建要加 c
htpasswd -cm nginxuser httpuser2 创建用户httpuser2,第二次创建不用加 c
vim /etc/nginx/conf.d/a.com.conf
auth_basic_user_file 用户密码文件的位置
ngx_http_stub_status_module 状态页
ngx_http_log_module 指定日志格式的记录请求
access_log /var/log/nginx/a.com_access.log testlog;
日志的存放位置 /var/log/nginx/a.com_access.log
ngx_http_gzip_module 压缩 注:必须使用在生产中
gzip_comp_level 压缩的级别 1到9,默认是1
gzip_http_version 1.0 | 1.1 启用压缩功能时的协议版本,http一般是1.1
gzip_buffers 压缩时缓冲区数量及每个缓冲区的大小
gzip_types 针对什么资源压缩 例如:text文本和html压缩,默认对html压缩
gzip_vary on|off 如果启用压缩是否在响应报文的首部插入一个专门表示压缩的首部报文头部
gzip_proxied 压缩的时候,如果nginx充当登录服务器,是否对后端服务器的响应报文在某中条件下压缩,根据后端服务器发的信息决定压缩不压缩
gzip_min_length 64; 压缩的大小 单位字节
gzip_types text/xml text/css application/javascript text/plain; 压缩的资源
只要加密就需要证书
ssl_protocols ssl的协议支持的版本TLSv1;TLSv1.1;TLSv1.2
ssl_session_cache 我们通过http连接到网站 会有一些session会话消息,session消息为了加速访问可以考虑缓存cache
builtin[:size] 所用的openssl内建缓存,每个worker进程它的ssl会话信息是私有的,可以指定大小
[shared:name:size] 在多个worker之间使用一个共享的缓存。使用的时候要起名,并指定大小
ssl_session_timeout session会话的超时时长,默认是5分钟
make a.crt 创建证书
我们是加密的,如果要启用nginx分为要输入密码,我们可以解密密码
openssl rsa -in a.key -out aa.key a.key解密成aa.key
cp a.crt aa.key /etc/nginx/conf.d/
可以创建多https加密虚拟主机,因为nginx支持SNI名称空间,要创建新的证书,秘钥
openssl s_client -connect www.c.com:443
ngx_http_rewrite_module
例如:我们平常访问http:/www/baidu.com 会跳到https:/www/baidu.com,就是基于rewrite实现的
last :url会按照正则表达式去查找,例如:如果找到符合的url2就会替换成新的url2,然后看到last就不会往下查找 ,建议不要在location中使用,会造成死循环
break : 如果发现break就在终止跳转,不会在往下跳转,不会造成死循环
http://nginx/regex1 ---》http://nginx/url2
rewrite ^/bbs/(.*)$ /froum/$1 last
如果访问^/bbs/开头的index.html文件就跳转到froum下的index.html文件
rewrite / https://www.a.com/ redirect;
如果访问/根网站,就转到https://www.a.com/
if ( $scheme = http ){ 如果是http就跳转到https://www.a.com/
rewrite / https://www.a.com/ redirect;
如果访问www.a.com/admin/就返回拒绝,显示这是一个非法地址
if如果 url ~* 不区分大小写,包含admin的就返回403拒绝访问,并返回一个提示DENY ACCESS
在a的网站主页目录/data/sitea/目录下创建一个daolian.html
在a网站盗取了b网站的图片,为a网站服务
我们要避免这种情况,来避免自己网站的图片被别的网站盗取我们的图片
跳转,当我们点击www.b.com的时候。从当前站点跳转到www.b.com
varid_referer有效的访问, 根据跳转的网站,是非法的还是合法的,假如,是从百度跳过来的就是合法的,从别的地方跳过来的就是非法的。
我们用varid_referer决定谁是合法的,谁是非法的
blocked:请求报文有referer首部,但没有有效值,可能是反向代理服务器吧referer清空了
server_names 参数,将来带有的值是某一个域名,当然也有可能是某一个模式
regular expression 可以写正则表达式,但是有一个要求,要用~波浪符表示开头,后面才是正则表达式
valid_referers none block server_names *.b.com ~\.baidu\.; none 没有referer的,block有referer但是没值的,server_names带有域名的,*.b.com以b.com结尾的,~\.baidu\包含baidu的都是合法的
if ($invalid_referer) { 其他的都是非法的,返回403
当访问www.a.com 的根时候就代理到后端的192.168.63.131服务器
因为/bbs 比/ 更精确,优先级更高,所以先查找/bbs目录的url下的数据,发现一bbs开头的目录下的文件都转换成/froun目录下的文件,然后在查找/根发现,代理到192.168.63.131后端的服务器上,就变成了http://192.168.63.131//froun/.*
加/斜杆: 就是当访问/bbs的时候,就置换成http://192.168.63.131/
不加/斜杆:当访问/bbs的时候,就在http://192.168.63.131/后面加/bbs目录充当我的URL,变成http://192.168.63.131/bbs
proxy_pass 前面加斜杆是不允许有正则表达式的,否则会有语法错误
只有图片文件的时候例如 .jpg .gif 等文件的时候,才调度到http://192.168.63.131 服务器
一台后端服务器安装Apache,php-fpm ,php-mysql连接数据库
一台后端服务器安装数据库,mariadb-server,创建允许远程连接的用户
注意:后端服务器收到的请求的ip地址来源于nginx代理服务器的ip,并不是真正的远程客户端的ip
解决方法:是在数据报文的头部在添加一个新的头,数据报文的结构有首行,首部字段行,还有实体行,其中我们可以在首部字段添加一个新的报文头部。就是在请求报文的头部加上客户端的ip
但是后端的web服务器默认记录日志,记录的是还是客户端也就是nginx代理服务器的地址,不会记录加的报文头部的地址,因为web服务器的日志格式是预先定义好的,所以我们要更改日志的格式
proxy_set_header remoteclientip $remote_addr
vim /etc/httpd/conf/httpd.conf
remoteclientip是在nginx代理服务器上新加的头部
proxy_add_x_forwarded_for 解决多层代理
在生产中可能有多台代理服务器,我们可以将多台代理服务器地址累加在一起
如果在两层代理服务器上都加proxy_set_header 会在后端服务器上看到所有叠加的代理服务器的ip,还有真实的客户端ip
如果只在最外层的代理服务器上加proxy_setheader,在后端服务器上的日志只会显示真实客户端的ip,看不到中间发现代理服务器的地址
proxy_cache_path 可以定义反向代理缓存的功能
我们可以将一些页面缓存到服务器上,下次客户端就不需要跑到后端服务器去找数据了,直接在代理服务器进行数据的响应,进而提高速度
[levels=levels]存放缓存不是文件名的方式,而是把文件起哈希值做计算,把哈希值当文件名,哈希值存的时候会按照一级,二级,三级,定义多少级来存,每一级就是安装哈希值的数字来作为文件夹名,所以要设定,分几级,每一级占几个16进制数
keys_zone=name:size 是否起一个名称,这个名字是将来要在某个虚拟主机去用这个缓存,所以要起一个名字,调用这个名称,接下来还要指定它的大小,缓存占多大空间
[inactive=time] 缓存失效的时间,当失效了就将缓存删掉
proxy_cache_path /var/cache/nginx/proxy_cache 将来要存放缓存的位置
levels=1:1:1 keys_zone=proxycache:20m
注意: keys_zone指定的20m,说的是在内存中占20m的空间,但是这个缓存存的不是数据,真正的数据放在/var/cache/nginx/proxy_cache 磁盘路径里面,这个缓存放在内存中是key键和metadata源数据,所谓的key键就是用户访问的url,值就是文件名,但是值不放在缓存的内存中,它是放在磁盘空间上max_size=1g; 最大1g
放的是key和metadata源数据,比如说源数据访问了多少次
/var/cache/nginx/proxy_cache 这个路径放的的是页面文件,放在磁盘里面
vim /etc/nginx/nginx.conf 主配置文件
在我们的虚拟主机记录 在哪个location里面转发的时候反向代理服务器缓存信息放在过程指定的位置里面
proxy_cache proxycache; 指定前面定义缓存的名字proxycache,要定义这个缓存
proxy_cache_key $request_uri; 调用的时候用$request_uri用户访问的url当key,值是文件内容
proxy_cache_valid 200 302 301 1h; 在200 302 301 这些响应吗的时候才启用缓存,缓存1小时
proxy_cache_valid any 1m; 其他的缓存1分钟
内存里面放的是,访问的url也就是key键,还有metadata源数据,访问了几次也就是缓存命中率
真正的数据是存放在磁盘上的,而且存放磁盘的时候他是把文件做了一个哈希运算,放到文件上
如果后端服务器down机了,然后缓存的信息又过期了,我们可以考虑用过期的缓存继续提供服务
proxy_hide_header 隐藏后端服务器的特定报文
ngx_http_headers_module模块,加这个模块有助于排除
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的
add_header X-Via $server_addr; 中间的反向代理服务器地址
add_header X-Cache $upstream_cache_status; 缓存的命中率情况
add_header X-Accel $server_name; server的名称
192.168.63.132 php-fpm php-mysql
yum install php-fpm php-mysql -y
listen.allowed_clients = 192.168.63.131 允许访问的ip
pm.status_path = /status 启用测试页面
ping.response = pong 测试PHP测试是否存活
fastcgi_param nginx要充当fastcgi的客户端要传一些变量参数过去
在nginx的程序中已经有很多自带的有关fastcgi变量在/etc/nginx/fastcgi_params
fastcgi_param 就是fastcgi传过去的具体路径,将来将前端发来的PHP请求发送到后端fastcgi哪个文件夹上
location ~* ^/(pm_status|ping)$ { 当访问fastcgi的pm_status或ping的时候就转发大后端的fastcgi服务器
fastcgi_pass 192.168.63.141:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
在主配置文件http语句块插入,缓存的存放的路径,还有定义缓存的名字fcgicache,内存的大小20m,这个内存存放的是key键和源数据和源数据的次数。缓存的值是放在磁盘里面
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
nginx自带健康性检查功能,如果发现有一台后端服务器down机,可以实现不给down的服务器调度
例如后端有多台服务器,可以用nginx的upstream模块实现调度
location / 当访问根的时候,访问的www代表的两个主机
还可以设置连接后端服务器失败几次,超出这个数字,就是出故障了,就不调度了
还可以设置超时时长,多长时间连接不了后端服务器,后端服务器就故障了
可以将后端服务器标记为备用,只有后端的所有服务器都不能用了,才启用备用服务器
还可以吧后端服务器标记为不可用,就不往这个服务器上调度,例如要更新的时候,可以先把这个服务器下线,进行更新
进行源地址进行哈希运算,只要是同一个ip地址来的请求,始终往一个服务器上调度
hash $request_uri 根据uri进行调度,例如我们有一台调度服务器,后端有2台服务器,用户发来请求,我们查看uri是什么,如果一个url就向后端其中以个服务器进行调度,如果是另一个uri就向另外一个服务器调度,这2个服务器的权重还不一样,第一台服务器的权重是1,第二台服务器的权重是2,我们可以根据权重进行哈希运算并和权重的总和取模,