设为首页 收藏本站
查看: 641|回复: 0

[经验分享] Nginx 这么详细 你不服不好使

[复制链接]

尚未签到

发表于 2018-11-13 09:38:42 | 显示全部楼层 |阅读模式
  Nginx
  轻量级、高性能HTTP服务器
  高性能的reverse proxy反向代理服务器
  代理http、mail
  高性能、稳定性、丰富的特性,配置简单
  单进程:阻塞
  多进程:每个进程响应一个请求
  进程量大,进程切换次数过多
  每个进程的地址空间是独立的,很多空间是重复的数据,所以内存使用效率较低
  线程:thread
  Light Weight Process, LWP  轻量级进程
  每个线程响应一个请求
  线程切换:线程切换较之进程切换属于轻量级切换
  同一个进程的线程可以共享进程的诸多资源,比如打开的文件、传输的信号等
  对内存的需求较之进程略有下降
  快速切换时会带来线程抖动
  多进程多线程
  多线程:
  一个线程响应多个请求
  AIO:异步IO,不会因为IO没有完成,阻塞线程
  多路IO,IO复用
  IO DEVICE-------KERNEL BUFFER---------PROCESS
  用户请求--->进程响应--->进程请求内核缓存中的数据---->内核向IO设备发出数据请求--->io设备将数据填满内核的BUFFER--->内核BUFFER将数据复制进程内存--->响应用户请求
  根据IO等待模式不同,IO等待分为5种模式:
  blocking IO:阻塞IO
  同步阻塞IO:通过read/write完成交互
  进程等待IO设备向内核BUFFER填充数据,内核BUFFER将数据复制到进程地址空间,此过程进程处于阻塞状态
  nonblocking IO:非阻塞IO
  同步非阻塞IO:通过read/write完成交互
  IO设备向内核BUFFER填充数据时,进程处于不停地询问状态,内核BUFFER向进程地址空间复制数据时,进程处于阻塞状态
  IO multiplexing:IO复用,一个进程请求多个IO
  异步阻塞IO
  IO设备向内核BUFFER中填充数据,进程阻塞;数据填充完毕,再次向内核BUFFER发送请求,等待内核BUFFTER将数据复制到进程地址空间,进程阻塞
  signal driven IO:信号驱动IO
  IO设备将数据复制到内核BUFFER后,通过信号告知进程数据复制完成;进程再次向内核BUFFER发送请求,等待内核BUFFER将数据复制到进程地址空间,进程阻塞
  水平触发:多次通知进程数据准备完成
  边缘触发:只通知一次进程数据准备完成
  epoll(linux)  /dev/poll(sloaris)  kquequ(freebsd)
  asynchronous IO:异步IO
  异步非阻塞IO
  发起请求,IO设备向内核BUFFER填充数据,内核BUFFER将数据复制到进程地址空间,完成后,通过信号通知进程
  mmap---内存映射机制
  将IO设备中的数据映射到内核BUFFER中,不需要复制数据,只是在内核BUFFER中与IO设备中的数据建立映射关系
  Nginx特性:
  支持AIO,event-driven IO ,mmap
  一个线程响应多个请求
  httpd:
  MPM
  prefork:一个进程响应一个请求,1024
  worker:一个线程响应一个请求,多进程,一个进程生成多个线程
  event: 基于事件驱动实现
  Nginx:
  web服务器
  反向代理
  web
  mail
  模块化
  重新加载配置及在线升级时,不需要中断正在处理的请求(nginx热部署)
  带缓存的日志写操作
  重写(rewrite)模块
  支持验证HTTP referer,实现反倒链机制
  支持sendfile,将数据在内核中直接封装响应客户端,不需要将数据复制到进程地址空间
  10000个非活跃的HTTP KEEPALIVE连接仅占用2.5M内存
  varnish,squid
  nginx:cache(disk)
  httpd:cache(disk,memory)
  Nginx启动时会启动一个主进程master及多个子进程worker;配置缓存时还会启动cache load和cache manager进程。所有进程以"共享内存"机制完成进程间通信;master进程以特权用户运行,其他进程以非特权用户运行
  master主进程主要完成如下工作:
  1、读取并验证配置文件
  2、创建、绑定、及关闭套接字
  3、启动、终止及维护worker进程的个数
  4、无须中止服务而重新配置工作特性
  5、控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本
  6、重新打开日志文件
  7、编译嵌入式perl脚本
  worker进程主要完成如下工作:
  1、接收、传入并处理客户端的连接
  2、提供反向代理及过滤功能
  3、nginx任何能完成的其它任务
  cache load进程主要完成的工作:
  1、检查缓存存储中的缓存对象
  2、使用缓存元数据建立内存数据库
  cache manager进程的主要工作:
  1、缓存的失效及过期检验
  Nginx配置是分段的:
  main,http,server,upstream(反向代理),location(类似于documentroot),mail
  Nginx安装
  # useradd nginx
  # yum install -y pcre-devel openssl-devel
  # tar zxf nginx-1.4.7.tar.gz
  # cd nginx-1.4.7
  # ./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/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=/var/tmp/nginx/client \
  --http-proxy-temp-path=/var/tmp/nginx/proxy \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre \
  --with-file-aio \
  --with-http_ssl_module \
  --with-http_secure_link_module \
  --with-http_perl_module \
  # make && make install
  nginx服务启动脚本:
  #!/bin/bash
  #
  # chkconfig: 2345 86 14
  # Descirption: Nginx Script File
  prog="/usr/local/nginx/sbin/nginx"
  pfile="/var/run/nginx/nginx.pid"
  if [ $# -ne 1 ];then

  echo "Usage:`basename $0` { start | stop | restart |>  exit 9
  fi
  case $1 in
  start)
  $prog
  if [ $? -eq 0 ];then
  echo "Starting nginx service .....  [ok]"
  # create lock file
  touch /var/lock/subsys/nginx
  fi
  ;;
  stop)
  kill `cat $pfile`
  if [ $? -eq 0 ];then
  echo "Stopping nginx....  [ok]"
  fi
  ;;
  restart)
  kill `cat $pfile`
  echo "Stopping nginx...."
  $prog
  if [ $? -eq 0 ];then
  echo "Starting nginx service .....  [ok]"
  # create lock file
  touch /var/lock/subsys/nginx
  fi
  ;;
  reload)
  kill -s HUP `cat $pfile`
  ;;
  configtest)
  $prog -t &> /dev/null
  if [ $? -eq 0 ];then
  echo "Syntax is ok!!!"
  else
  $prog -t
  fi
  ;;
  *)

  echo "Usage:`basename $0` { start | stop | restart |>  ;;
  esac
  mime:多用途互联网邮件扩展
  用于识别非文本文档
  Nginx配置---/etc/nginx/nginx.conf
  启动worker进程的数量;如果是CPU密集型,如SSL及压缩应用,worker数量与CPU个数一致;如果是IO密集型,如响应大量给客户端 ,worker进程个数为CPU个数的1.5或者2倍
  worker_processes  1;
  每个worker进程支持的连接数
  events {
  worker_connections  1024;
  }
  启用sendfile机制
  sendfile        on;
  启用长连接并设置超时时间
  keepalive_timeout  65;
  是否对发送给客户端的内容进行压缩
  #gzip  on;
  每个server定义一个虚拟主机 server { }
  location / {
  root   html;
  index  index.html index.htm;
  }
  location /URI路径 {
  root"/web/htdocs"定义URI路径所对应的网页文件存放的路径
  }
  URI路径
  http://www.bj.com/URI路径
  如果错误代码为500,502,503,504,则返回URI路径下50x.html页面内容
  error_page   500 502 503 504  /50x.html;
  location [ = | ~ | ~* | ^~ ] URI路径 {...}
  location URI路径 {}:
  对当前路径及子路径下的所有资源都生效
  location = URI路径 {}:
  精确匹配指定路径,不包括子路径,因此只对当前资源生效
  location ~ URI路径 {}:区分大小写
  locaiton ~* URI路径 {}:不区分大小写
  模式匹配URI路径,此处的URI可使用正则表达式
  location ^~ URI路径 {}
  不使用正则表达式
  匹配优先级:
  =匹配优先级最高
  ^~匹配优先级次之
  ~ ~*
  示例1:客户端通过http://10.1.1.1访问/web/htdocs下的网页
  location / {
  root   /web/htdocs;
  index  index.html index.htm;
  }
  示例2:客户端通过http://10.1.1.1/bbs,访问/web/bbs下的网页
  location /bbs {
  root /web;
  index  index.html index.htm;
  }
  基于客户端IP地址进行访问控制
  location / {
  ....
  allow 10.1.1.100;
  deny 10.1.1.0/24;
  }
  默认规则是允许访问。如果想要明确禁止某个客户端访问可直接写deny 10.1.1.1;
  如果想要明确只允许某个客户端访问,要这样写
  allow 10.1.1.100
  deny all
  基于用户名/密码认证访问
  location / {
  auth_basic "please input user:";
  auth_basic_user_file /etc/nginx/.user;
  }
  使用htpasswd命令创建用户名、密码
  配置显示nginx连接数
  location /status {
  stub_status on;
  access_log off;
  allow 10.1.1.100;
  deny all;
  }
  http://10.1.1.1/status访问结果 :
  Active connections: 4 打开的所有连接数
  server accepts handled requests
  10 10 36 已经接受的连接数已经处理的连接数已经处理的请求数
  Reading: 0 Writing: 1 Waiting: 3
  Reading:nginx正在读取其报文首部的连接数
  Writing:nginx正在读取其报文主体的连接数、或者正在处理请求的请求个数以及正在响应客户端的连接个数
  Waiting:长连接中保持活动连接的连接个数(Reading+Writing)
  配置基于SSL的HTTP
  # HTTPS server
  #
  server {
  listen       443;
  server_name  localhost;
  ssl                  on;
  ssl_certificate      cert.pem;
  ssl_certificate_key  cert.key;
  ssl_session_timeout  5m;
  ssl_protocols  SSLv2 SSLv3 TLSv1;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers   on;
  location / {
  root   html;
  index  index.html index.htm;
  }
  }
  生成自签证书:
  # cd /etc/pki/CA
  生成证书服务器私钥
  # (umask 077; openssl genrsa 2048 > private/cakey.pem)
  Generating RSA private key, 2048 bit long modulus
  .........................+++
  ..............+++
  e is 65537 (0x10001)
  生成自签证书
  # openssl req -new -x509 -key private/cakey.pem -out cacert.pem
  # touch index.txt
  # echo 01>serial
  生成WEB服务器的密钥
  # mkdir /etc/nginx/ssl
  # cd /etc/nginx/ssl
  # (umask 077;openssl genrsa 1024 > nginx.key)
  Generating RSA private key, 1024 bit long modulus
  ..............................++++++
  .............++++++
  e is 65537 (0x10001)
  创建证书申请
  # (umask 077;openssl genrsa 1024 > nginx.key)
  # openssl req -new -key /etc/nginx/nginx.key -out /etc/nginx/nginx.csr
  签署证书
  # openssl ca -in nginx.csr -out nginx.crt -days 3650
  配置基于域名的虚拟主机
  server {
  listen 80;
  server_name www.a.com;
  location / {
  root /web/a;
  index index.html;
  access_log /var/log/nginx/bj/access_log main;
  error_log /var/log/nginx/bj/error_log;
  }
  }
  LEMP/LNMP:
  PHP+MySQL
  仅支持以FastCGI方式工作的PHP
  安装MySQL-5.6通用二进制软件
  # useradd mysql
  # mkdir /mydata/data
  # chown -R /mydata/data
  # tar zxf mysql-5.6.28-linux-glibc2.5-i686.tar.gz -C /usr/local/
  # cd /usr/local/
  # ln -s mysql-5.6.28-linux-glibc2.5-i686/ mysql
  # cd /usr/local/mysql
  # chown -R root.mysql ./*
  # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
  # chmod +x /etc/rc.d/init.d/mysqld
  # chkconfig --add mysqld
  # scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
  # vim my.cnf
  datadir=/mydata/data
  socket=/tmp/mysql.sock
  innodb_file_per_table=1
  # /etc/init.d/mysqld start
  # netstat -tnlp | grep mysqld
  tcp        0      0 :::3306                     :::*                        LISTEN      9816/mysqld
  # vim /etc/profile
  export PATH=$PATH:/usr/local/mysql/bin
  # source /etc/profile
  导出mysql库文件
  # vim /etc/ld.so.conf.d/mysql.conf
  /usr/local/mysql/lib
  # ldconfig -v
  导出mysql头文件
  # ln -s /usr/local/mysql/include/ /usr/include/mysql
  安装php-5.3.6
  # yum localinstall -y --nogpgcheck libmcrypt-2.5.7-1.2.el6.rf.i686.rpm libmcrypt-devel-2.5.7-1.2.el6.rf.i686.rpm mhash-0.9.9-1.el6.rf.i686.rpm mhash-devel-0.9.9-1.el6.rf.i686.rpm mcrypt-2.6.8-10.el6.i686.rpm
  # tar zxf php-5.3.6.tar.gz
  # cd php-5.3.6
  # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib  --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
  # make && make install
  复制php配置文件
  # cp php.ini-production /etc/php.ini
  复制php-fpm配置文件
  # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
  复制php-fpm启动脚本
  # cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
  # chmod +x /etc/rc.d/init.d/php-fpm
  # chkconfig --add php-fpm
  # chkconfig --list php-fpm
  php-fpm        0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭
  编辑/usr/local/php/etc/php-fpm.conf配置文件
  # vim /usr/local/php/etc/php-fpm.conf
  pm.max_children = 150
  pm.start_servers = 8
  pm.min_spare_servers = 8
  pm.max_spare_servers = 10
  pid=pid=/usr/local/php/var/run/php-fpm.pid
  user=nginx
  group=nginx
  # /etc/init.d/php-fpm start
  Starting php-fpm  done
  # netstat -tnlp | grep php-fpm
  tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      15457/php-fpm
  整合nginx和php
  编辑nginx配置文件,去掉如下配置的注释:
  # vim /etc/nginx/nginx.conf
  location ~ \.php$ {
  root           /web/htdocs;
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  include        fastcgi_params;
  }
  编辑/etc/nginx/fastcgi_params文件,并将内容修改为如下内容,配置fastcgi参数:
  fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
  fastcgi_param  SERVER_SOFTWARE  nginx;
  fastcgi_param  QUERY_STRING  $query_string;
  fastcgi_param  REQUEST_METHOD  $request_method;
  fastcgi_param  CONTENT_TYPE  $content_type;
  fastcgi_param  CONTENT_LENGTH  $content_length;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  fastcgi_param  SCRIPT_NAME  $fastcgi_script_name;
  fastcgi_param  REQUEST_URI  $request_uri;
  fastcgi_param  DOCUMENT_URI  $document_uri;
  fastcgi_param  DOCUMENT_ROOT  $document_root;
  fastcgi_param  SERVER_PROTOCOL    $server_protocol;
  fastcgi_param  REMOTE_ADDR  $remote_addr;
  fastcgi_param  REMOTE_PORT  $remote_port;
  fastcgi_param  SERVER_ADDR  $server_addr;
  fastcgi_param  SERVER_PORT  $server_port;
  fastcgi_param  SERVER_NAME  $server_name;
  编辑nginx配置文件,指定php首页
  # vim /etc/nginx/nginx.conf
  location / {
  root   /web/htdocs;
  index  index.php index.html index.htm;
  }
  # /etc/init.d/nginx restart
  在/web/htdocs目录下创建php页面,测试访问
  # vim /web/htdocs/index.php
  
  xcache:在同一个PHP服务器,为多个进程缓存同一个opcode
  安装xcache-2.0.0,加速php解析
  # yum install -y m4 autoconf
  # tar zxf xcache-2.0.0.tar.gz
  # cd xcache-2.0.0
  生成configure配置程序
  # /usr/local/php/bin/phpize
  Configuring for:
  PHP Api Version:         20090626
  Zend Module Api No:      20090626
  Zend Extension Api No:   220090626
  # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
  # make && make install
  安装完毕后,有如下提示:
  Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
  编辑php.ini,整合php与xcache
  将xcache提供的样例配置导入php.ini
  # mkdir /etc/php.d
  # cp xcache.ini /etc/php.d/
  编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下内容:
  zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/xcache.so
  重新启动php-fpm
  /etc/init.d/php-fpm restart
  通过浏览器再次浏览php页面,在页面中可以找到关于xcache特性说明,表明成功
  XCache
  XCache Supportenabled
  Version 2.0.0
  Modules Built cacher
  Readonly Protection N/A
  Cache Init Time 2015-12-24 14:04:43

  Cache Instance>  Opcode Cache enabled, 62,914,560 bytes, 1 split(s), with 8192 slots each
  Variable Cache enabled, 4,194,304 bytes, 1 split(s), with 8192 slots each
  Shared Memory Schemes mmap
  memcached:缓存服务器
  缓存可序列化的数据(string,object)
  以key:value方式缓存数据
  不可实现持久存储
  如缓存php session,及后台数据库的数据
  redis:缓存服务器
  以列表方式缓存数据,以数据表的方式
  可以使用持久存储
  NoSQL
  如缓存计数器
  location ~* \.php$ {
  fastcgi_pass 127.0.0.1:9000;
  }
  Nginx反向代理
  server {
  listen 80;
  server_name www.bj.com;
  location / {
  后端服务器;
  }
  }
  后端服务器:
  proxy_pass
  示例:用户访问www.bj.com/forum时,将以后台服务器10.1.1.2的bbs目录中的页面返回客户端
  location /forum {
  proxy_pass http://10.1.1.2/bbs;
  }
  特殊情况:
  如果在定义location时,加入了~  ~*  ^~这样的模式匹配字符,proxy_pass在写时,只能写到服务器地址
  location ~* /forum {
  proxy_pass http://10.1.1.2;
  }
  当用户访问www.bj.com/forum时,将代理到http://10.1.1.2/forum
  nginx反向代理示例配置:
  10.1.1.1安装nginx作为前端服务器
  10.1.1.2安装httpd作为后端服务器
  客户端访问http://10.1.1.1/forum时,代理到后端服务器的http://10.1.1.2/bbs
  location /forum {
  proxy_pass http://10.1.1.2/bbs;
  }
  使用模式匹配的方式定义location,当客户端访问http://10.1.1.1/forum时,代理到后端服务器http://10.1.1.2/forum上
  location ~* ^/forum {
  proxy_pass http://10.1.1.2;
  }
  后端服务器上也要有对应的forum目录
  此时,对于后端服务器来说,access_log中记录的日志,客户端IP是nginx的IP
  10.1.1.1 - - [24/Dec/2015:16:35:36 +0800] "GET /forum/ HTTP/1.0" 200 35 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 BIDUBrowser/8.1 Safari/537.36"
  配置proxy_set_header,实现后端服务器记录真实的客户端IP
  编辑/etc/nginx/nginx.conf
  # vim /etc/nginx/nginx.conf
  location ~* ^/forum {
  proxy_pass http://10.1.1.2;
  proxy_set_header X-Real-IP $remote_addr;
  }
  proxy_set_header X-Real-IP $remote_addr;
  代理在httpd请求报文中加入X-Real-IP段的内容,该内容是变量$remote_addr的值,即真实客户端的IP
  编辑后端服务器配置文件/etc/httpd/conf/httpd.conf,修改combined日志格式,将客户端地址%h换成%{X-Real-IP}i,表示记录HTTP请求报文中X-Real-IP的内容
  LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  刷新浏览器,再次查看后端服务器access_log,日志中记录的是真实客户端的IP地址10.1.1.100
  10.1.1.100 - - [24/Dec/2015:16:38:54 +0800] "GET /forum/ HTTP/1.0" 200 35 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 BIDUBrowser/8.1 Safari/537.36"
  Nginx负载均衡
  Nginx负载均衡算法:
  round-robin,默认算法
  ip_hash:根据请求报文中的源IP地址,将相同客户端的请求转发到同一个服务器上
  least_conn
  nginx负载均衡配置:
  定义upstream段,指定后端服务器IP;upstream段要写在server段外面
  upstream webserver {
  server 10.1.1.2 weight=1 max_fails=2 fail_timeout=2;
  server 10.1.1.3 weight=1 max_fails=2 fail_timeout=2;
  server 127.0.0.1:8080 backup;
  }
  server {
  ....
  location / {
  proxy_pass http://webserver/;
  proxy_set_header X-Real-IP $remote_addr;
  }
  }
  定义虚拟主机,提供错误页面
  server {
  listen 8080;
  server_name localhost;
  location / {
  root /web/sorry;
  index index.html;
  }
  }
  在/web/sorry目录下提供index.html错误页面
  经过以上配置后,当客户端访问http://10.1.1.1时,由后端两台服务器10.1.1.2和10.1.1.3负载均衡方式提供页面;当两台后端服务器均down后,跳转到本地8080端口所对应的页面
  Nginx缓存
  cache: 共享内存: 存储键和缓存对象元数据
  磁盘空间:存储数据
  定义缓存空间
  proxy_cache_path: 不能定义在server{}中
  proxy_cache_path /nginx/cache/first levels=1:2:3 keys_zone=first:20m max-size=1G
  levels=
  定义缓存目录子目录的级别,及每个子目录的名称字符个数; 最多只能有3级子目录
  levels=1:2:3,3级子目录,第1级目录字符个数为1,第2级目录字符个数为2,第3级目录字符个数为3
  keys_zone=name:size
  定义存储键的区域
  max-size=1G
  指定/nginx/cache/first中的1G空间用于存储缓存数据
  Nginx缓存配置:
  定义缓存存放路径为/web/cache/first, 最多使用1G空间; 并定义键值区域名称为first,大小为20m
  proxy_cache_path /web/cache/first levels=1:2 keys_zone=first:20m max-size 1g;
  在location中开启缓存功能,指定使用键值名称为first的缓存
  在httpd响应报文中添加额外项X-cache,用于查看缓存是否命中
  add_header X-cache "$upstream_cache_status by $server_addr";
  $upstream_cache_status: 用于记录缓存是否命中的状态
  location / {
  proxy_pass http://webserver/;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_cache first;
  proxy_cache_valid 200 1m;
  }
  proxy_cache_valid 200 1m;
  表示为状态码为200的数据缓存1分钟
  查看缓存是否命中,在浏览器中按F12打开开发者模式,查看HTTP响应报文,可以看到X-cache:HIT by 10.1.1.1信息,表示缓存命中
  常用的3种缓存:
  open_log_cache:日志缓存,将日志先保存到内存,再同步到磁盘,降低磁盘IO
  open_file_cache:加快响应速度 
  fastcgi_cache
  rewrite:URL地址重写
  if (condition) {
  ...
  ...
  }
  建议放在locaiton{ }中使用
  测试:
  双目测试
  ~,!~
  =,!=
  ~*,!~*
  if($request_method ="POST"){
  }
  if ($request_uri ~* "/forum") {
  }
  单目测试
  rewrite支持正则表达式
  rewrite格式:
  rewrite regex replacement [flag]
  flag:
  last:本次重写完成后,重启下一轮检查;大多数情况下使用
  break:本次重写完成后,直接执行后续操作; 不再进行下一轮检查;在非根location下用break
  客户端访问http://10.1.1.1/bbs时,重定向到http://10.1.1.2/forum上
  location / {
  root   html;
  index  index.html index.htm;
  rewrite ^/bbs/(.*)$ http://10.1.1.2/forum/$1;
  }
  客户端访问http://10.1.1.1/bbs时,重写向到本地网页根目录下的forum目录
  location / {
  root   html;
  index  index.html index.htm;
  rewrite ^/bbs/(.*)$ /forum/$1;
  }
  WebDAV(Web-based Distributed Authoring and Versioning)
  一种基于HTTP 1.1协议的通信协议,它扩展了HTTP 1.1,在GET,POST,HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。
  rpm httpd默认支持DAV功能
  通过此协议可以支持在Web Server上传文件
  Nginx读写分离
  前端:Nginx服务器  10.1.1.1
  后端:Apache服务器10.1.1.2   10.1.1.3(可在此服务器上传文件)
  确保10.1.1.3服务器开启DAV功能
  确保Apache配置文件加载了DAV相关模块
  # vim /etc/httpd/conf/httpd.conf
  LoadModule dav_module modules/mod_dav.so
  LoadModule dav_fs_module modules/mod_dav_fs.so
  在相应网页根目录授权段中开启DAV
  
  ....
  dav on
  
  确保运行httpd进程的apache用户对网页根目录拥有写入权限
  # setfacl -m u:apache:rwx /var/www/html/
  测试在客户端可以向10.1.1.3服务器上传文件
  # curl -T /etc/issue http://10.1.1.3
  前端Nginx服务器配置读写分离,读操作代理到10.1.1.2上,写操作代理到10.1.1.3上;
  # vim /etc/nginx/nginx.conf
  location / {
  proxy_pass http://10.1.1.2;
  if ($request_method = "PUT") {
  proxy_pass http://10.1.1.3;
  }
  }
  测试nginx读写分离操作是否成功
  读取网页内容时,代理后10.1.1.2服务器上
  # curl http://10.1.1.1
  Apache Page of 10.1.1.2
  上传文件时,代理到后端10.1.1.3服务器上
  # curl -T /etc/fstab http://10.1.1.1
  
  
  201 Created
  
  Created
  Resource /fstab has been created.
  
  Apache/2.2.15 (Red Hat) Server at 10.1.1.3 Port 80
  
  后端两台服务器通过rsync+inotify进行数据同步,保证上传的数据可以同步到后端所有服务器上


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634419-1-1.html 上篇帖子: nginx限制用户下载文件速率 下篇帖子: NGINX编译安装后添加新模块的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表