工作架构模型是
nginx做前端反向代理处理请求,后端为lamp(php-fpm也为代理,代理处理动态网页请求,此外我们还可以安装Xcache为php-fpm处理动态网页加速)或者lnmp
基础知识理解
1、代理基础知识
代理:就是客户端请求一个互联网资源时,他没有能力到达真正的服务器,而是通过委托一个能够在互联网上取得各种资源的专业服务器帮他完成它想要请求的资源,并把结果返回给客户端的服务器叫做代理服务器
代理工作原理
分两个阶段,一是客户端请求到代理,代理到服务器取回资源到代理,然后代理服务器再拆封装,查看请求的资源,并缓存请求资源,再封装成httpd响应报文返回给客户端,不是所有的资源都会缓存,不缓存也要拆封装,代理服务器起到乘上启下的作用,压力较大,它要维持两个会话,一个是客户端到代理,另一个是代理到服务器。
正向代理
正向代理 :代理去找任何服务器,并把结果返回给客户端的服务器,他工作在局域网边缘,代理客户端
缓存代理服务器:由于代理服务器的压力比较大,就引入了缓存代理服务器,当代理客户端去访问远程服务
反向代理
反向代理:代理服务器代理服务器接受客户端的请求,只接受客户端的请求,不做其它处理。代理服务器就好像秘书,服务器就是老板。
代理服务工作原理
多级代理:让客户端知道经过哪些代理
nginx
客户端请求是把所有请求缓存在代理,再把全部请求一次性发给后端服务器
响应是服务器边响应就边发给缓存代理,代理也就马上发给客户端不做缓存,如果服务端响应完代理,代理还没有响应完客户端,代理才会缓存
squal和nginx的不同也就在于此处,它是响应代理都是边响应边发送。导致会话建立长久,并发大的时候,压力就很大
内存及磁盘资源分配
1、client_body_in_file_only on|cleaan|off
http 的包体是否出场在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件,弄表示请求结束后包体文件不会被删除,clean表示会别删除,默认为off
clean 的话是客户端上传一个大的附件上传完了就回删除
2、client_body_in_single_buffer on|off
http 的包体是否存储在内存buffer当中;默认为off
3、client_body_buffer_size size
nginx 接受HTTP包体的内存缓存区大小
4、client_body_temp_path dir-path [level1 [level2 [level3]]]; 缓存子目录
http包体重复的临时目录
5、client_header_buffer_size size;
正常情况下接受用户请求的http报文header部分是分配的buffer大小,默认为k
6、large_client_header_buffers number size
存储超大http请求首部的捏成buffer大小及个数
7、connection_pool_size size
内存连接池
nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256, 2 8 法则,正太分布
8、request_pool size size
nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k
nginx 的两种用途
静态内容的web服务器
反向代理
https://fedoraproject.org/wiki/EPEL
编译安装烧水的故事
阻塞 、同步
阻塞 、异步
非阻塞、异步
阻塞就是:线程在
老王
一、安装Nginx:
1、解决依赖关系
# yum groupinstall "Development Tools" "Server Platform Deveopment" -y && yum install openssl-devel pcre-devel -y
2、安装
首先添加用户nginx,实现以之运行nginx服务进程:
# groupadd -r nginx
# useradd -r -g nginx nginx
mkdir /data
接着开始编译和安装:
# ./configure \
--prefix=/usr/local/nginx \
--error-log-path=/data/applogs/nginx/error.log \
--http-log-path=/data/applogs/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/usr/local/nginx/client/ \
--http-proxy-temp-path=/usr/local/nginx/proxy/ \
--http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi \
--http-scgi-temp-path=/usr/local/nginx/scgi \
--with-pcre
# make && make install
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
chmod +x nginx
不然回出现这种情况
env: /etc/init.d/nginx: Permission denied
记录真实日志访问
proxy_set_header X-Real-IP $remote_addr;
LogFormat "%{X-Real-IP}i
service httpd restart
#gzip on; 下
upstream webservers {
server 192.168.1.144 weight=3 max_fails=2 fail_time=3;
server 192.168.1.145 weight=1 max_fails=2 fail_time=3;
server 127.0.0.1 backup;
ip hash session 绑定
lest_conn
}
server {
listen 80;
server_name www.node3.com ;
proxy_set_header X-Real-IP $remote_addr; 后端服务端http加 LogFormat "%{X-Real-IP}i 然后访问,查看记录
add_header X-Via $server_addr; 让经过代理的信息,留下自己的ip,这个事在服务器上浏览查看浏览器的
location / {
proxy_pass http://webservers;
proxy_set_header 显示标记ip
proxy_hide_header 不显示版本号
proxy_pass_header 显示版本号
proxy_pass_request_body 是否将http请求报文的包体发往上游服务器
proxy_pass_request_header 是否将http首部发往上游服务器
}
}
# another virtual host 上
server {
listen 8080;
server_name 127.0.0.1;
root /www/backup;
}
proxy_redirect [default|off|redirect|replacement]
当上游服务器返回的响应是重定向或刷新请求时,proxy_redirect会重新设定http首部的location或refresh
proxy_redirect http://localhost:8080/imgs http://www.org.com/images
proxy_redirect http://localhost:8080/imgs http://www.org.com/images
网页重写
upstream 定义服务器组
server 在服务器组中定义各上游服务器
max_fails times
weight
backup
ip hash
proxy_buffer_size size 设定用于暂存来自于upsteam服务器的第一个响应报文的缓冲区大小
proxy_buffering on|off 启用缓冲upsteam服务器的响应报文,默认是关闭的,nginx对内存的使用有用严格的限制
如果要使用的话proxy_buffering on proxy_max_temp_file_size 设为0 就具有缓存功能,可以不把缓存存储在磁盘,直接就
同步发给客户端
proxy_cache_path 定义缓存目录
nginx默认缓存是保存在磁盘上,但是可以把缓存放在mem-cache
nginx缓存的原理
(zone name)hash表-----缓存空间---多级缓存
缓存信息:客户端的私人信息不被缓存 可以定义缓存那些,不缓存那些,缓存时间多久等
wanish 可以把缓存直接缓存内存中
levels 层级目录
proxy_cache_use_stale error 过期缓存
在server下定义
定义nginx缓存(缓存在固态硬盘) key缓存在哪里大小100m 磁盘空间有多大 缓存保存多久
proxy_cache_path /cache/webserve levels=1:2 keys_zone=web:100m max_size=1g inactive=12h;
server {
listen 80;
server_name www.node3.com ;
proxy_set_header X-Real-IP $remote_addr; 后端服务端http加 LogFormat "%{X-Real-IP}i 然后访问,查看记录
add_header X-Via $server_addr; 让经过代理的信息,留下自己的ip,这个事在服务器上浏览查看浏览器的
add_header X-Cache $upstream_cache_status; 在网页浏览器中定义可以查看网页是否命中
location / {
proxy_pass http://webservers;
proxy_set_header 显示标记ip
proxy_hide_header 不显示版本号
proxy_pass_header 显示版本号
proxy_pass_request_body 是否将http请求报文的包体发往上游服务器
proxy_pass_request_header 是否将http首部发往上游服务器
proxy_cache web; 调用缓存
proxy_cache_valid 200 2h;
proxy_cache_vaild 301 302 10m;
proxy_cache_vaild any 1m; 定义缓存那些内容
}
}
mkdir /cache/webserver
可以 ls查看
或者去浏览器访问,f12查看hit是否命中
cdn 缓存服务器
全局服务缓存服务器
location 匹配定义重定向至那台服务器
server {
listen 80;
server_name www.node3.com ;
proxy_set_header X-Real-IP $remote_addr; 后端服务端http加 LogFormat "%{X-Real-IP}i 然后访问,查看记录
add_header X-Via $server_addr; 让经过代理的信息,留下自己的ip,这个事在服务器上浏览查看浏览器的
add_header X-Cache $upstream_cache_status; 在网页浏览器中定义可以查看网页是否命中
location / {
#proxy_pass http://webservers;基于域名来做的nginx反代
proxy_pass http://192.168.1.144 ; 其它的重定向到这个服务器
proxy_set_header 显示标记ip
proxy_hide_header 不显示版本号
proxy_pass_header 显示版本号
proxy_pass_request_body 是否将http请求报文的包体发往上游服务器
proxy_pass_request_header 是否将http首部发往上游服务器
proxy_cache web; 调用缓存
proxy_cache_valid 200 2h;
proxy_cache_vaild 301 302 10m;
proxy_cache_vaild any 1m; 定义缓存那些内容
}
location ~* \.(jpg|jpeg|png|gif)$ { 图片全部重定向这个服务器
proxy_pass http://192.168.1.145 ;
proxy_cache web; 调用缓存
proxy_cache_valid 200 2h;
proxy_cache_vaild 301 302 10m;
proxy_cache_vaild any 1m; 定义缓存那些内容
}
}
lnmp
nginx服务器自己提供静态内容服务;
对php的请求通过fastcgi模块代理制php-fpm服务器;
httpd,nginx
cg协议,通用网关协议
动态网页语言
php jsp python perl
cgi module fastcgi
四种模型
一对一
1、进程
2、线程
一对多
1、进程
2、线程
prifix
profox
php-fpm的工作原理
与profix模型一样
与python web
uwsgi协议
isp web
http协议
与php
fastcgi协议
perl web
http协议
php-fpm
先装mysql 或者maridb
在安装http
再安装php-fpm
1、提供php的服务脚本
在解压包中
cp php.ini-production /etc/php.ini
2、提供php-fpm的启动脚本
cp sapi/fpm/init.d.php /etc/rc.d/init.d/php-fpm
3、提供php-fpm配置脚本
cd /usr/local/php/etc/
cp php.fpm.conf.default php-fpm.conf
修改php-fpm.conf
1、pid
保证pid一致
[global]
pid = /usr/local/php/var/run/php-fpm.pid
2、启用日志
error.log = /var/log/php-fpm
pm = dynaminc配置段
pm.max.childen = 128 每个进程启动线程数
pm.start-server = 5 启动php-fpm时启动几个进程
pm.max-space-server = 5 启动空闲进程
pm.max-requests = 500 一个线程在处理完多少个请求时消亡 0表示 处理无数个,都不消亡,除非关机
pm.status-path = /status 主机状态信息
ping.path = /ping
ping.response = pong
php-fpm 类似一个轻量级的web网页服务器,http的精简版
php-fpm提供缓存
fastcgi_index: php的主页面文件
http 段定义一个缓存
fastcgi_cache_path /cache/fastcgi levels=1:2 keys_zone=fcgi:50m max_size=1g inactive=12h;
在location段调用缓存,并设置具体的缓存机制
fastcgi_cache 和 proxy_cache类型定义相同
server {
listen 80;
server_name www.node3.com ;
location ~* \.(jpg|jpeg|png|gif)$ { 图片全部重定向这个服务器
fastcgi_pass http://192.168.1.145 ;
fastcgi_cache fcgi; 调用缓存
fastcgi_cache_valid 200 2h;
fastcgi_cache_vaild 301 302 10m;
fastcgi_cache_vaild any 1m; 定义缓存那些内容
}
}
fastcgi_connect_timeout :连接fastcgi服务器的超时时长
fastcgi_send_timeout 向fastfcgi服务器传输数据的超时时长
http://www.org.com/test.php
定义fast_cgi的状态信息页面
location ~* /(status|ping) {
root /www/a.com;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
访问要求 http://www.a.com/status
http://www.a.com/status?html
pool
进程池
线程有线程池
定义最多启用多少个进程响应请求
cd /usr/local/php/etc
vim php-fpm.conf
process manager dynamic
进程管理器 有两类static和dynamic
start time 25/Apri
启动时间
start since 2150
运行时长
acceptnd conn 4021
已经接受的请求数
listen queue
等待队列中的请求个数
max listen queue 90
fpm启动以来等待队列中的请求的总数
listen queue len 128
等待队列长度
idle processes 4
空闲的进程数
active processes 5
活动进程数
total processes 5
总进程数
max active process 8
ftp启动以来最大活动进程数
max children reached 0
达到最大进程的次数
slow requests 0
慢速请求的个数
传统内存分配方式:malloc()、free()一有缓存就像内核申请内存,缓存失效就回收内存,会导致内存泄漏,内存丢失,反而降低了服务器的性能
memcache 解决了这个问题
如果设置了memcache,开机启动就会像内核申请一个固定内存空间,然后再把这个空间分成许多个固定的小片,有缓存来,就给他分配一个固定的小片,缓存失效就回收缓存,这个过程不再需要向内核申请参与,它会维持着像内核申请而来固定空间的大小。另外一个好处就是如果客户端来请求资源,它是指向服务器的,他最先会到缓存中来找资源,如果找到就直接返回给代理,而不会到后端服务器,基于这两点就可以提过服务器并发请求性能。
page 分配给slab用于切割的内存空间,默认大小1MB
chunk:用户缓存记录的内存空间
slab class 特定大小的chunk
自定义增长因子
memcache协议:文本格式,二进制格式
如果memcache是共享的话就会有一个很致命的弱点,如果其中一台服务器宕机或新上架一台服务器就会导致整个缓存改变,需要重新计算,重新生成缓存,如果这个时候压力过大就会导致雪崩效应,致使其它服务器压力过大,也宕机,这时候要重启服务器是起步起来的,压力太大,唯一有效的方法就是在前端反向代理那里控制请求并发,(具体做法是可以减少并发数,让其排队,或者把他重定向到状态页面内容为在维修,或者其他公共服务器上,再重新启动服务器,在慢慢放开前端并发。
针对memcache这个弱点,引入了环状一致性hash算法,作用就是如果后端服务器挂掉或者上架,只会导致一部分memcache丢失,损失不会太大。
并发响应模型
libevent库:epoll,poll,select
安装memcache
必须要安装libevent
然后安装memcache
编译安装也可以rpm包安装
yum install memcache -y
memcached -l 监听的地址
-d 运行的守护进程
-u 以指定的身份运行
-m 缓存服务器使用的内存空间,默认为64M
-c 最大并发连接数,默认1024
-p 监听的tcp端口,监听的tcp端口,默认12111
-u 监听的udp端口,0默认禁止,
-M 内存耗尽时返回错误而非删除缓存对象
-f 指定增长因子,默认为1.25
-n chuck起始大小,key+value+flags 默认为48
memcached -u memcached 启动memcached
ss -tulp
memcached -u memcached -f 1.5 -vv
存储类命令 set add replace append prepend
获取数据类命令 get delete incr/decr
统计类的命令:stats ,stats items , stats slabs, stats sizes
清除命令 flush_all
memcache 一半在缓存,一半在应用程序
程序员在开发时,自行调用了memcached的API,memcached的功能才能生效
memcached:服务器
memcached:php连接memcached服务可以使用扩展
memcache: php连接memcached服务可以使用另一个扩展
libmemcached: c库
memcache 服务安装
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com