Linux运维 第三阶段 (十六) nginx(2)

一、相关概念:

代理(你到我这请求我没有,我可以帮你去请求)

正向代理(forward proxy内网用户的client想上互联网,通过代理到互联网去取数据,数据返回到代理上,代理构建响应返回至client(代理内网用户访问互联网上服务器的数据);可将正向代理服务器理解为秘书(对内声称只要想上网我什么都能做,但实际是互联网上的某个服务器提供的内容))

反向代理(reverse proxy我们的服务器不允许直接访问,在前端放一代理,所有的互联网上的客户端想要访问,得将请求提交至前面的代理上,而代理服务器仅在需要时才找后端服务器;可将反向代理服务器理解为总管(它对外声称它就是web-server,但其实是它后端服务器提供的功能)

请求方法(GET、POST、HEAD、PUT、TRACE、OPTION、CONNECTION、DELETE)

常用指令:

proxy_pass(实现反向代理)

fastcgi_pass(php的反向代理)

upstream(实现负载均衡)

proxy_cache_path、proxy_cache、proxy_cache_valid(实现缓存功能)

add_header(在协议首部添加标签)

rewrite(URL重写)

valid_referers(防盗链功能,结合if实现)

gzip on;(开启此功能可节约带宽,并节省报文到达client的时间,并不是什么情况下都压缩,如果在缓存时候压缩会带来负作用,会降低命中率,如第一次第一个用户请求的内容缓存后压缩了,当第二个用户访问相同内容时将不能从缓存中响应)

gzip_proxied(设置压缩策略,什么情况下压缩,什么情况下不压缩,如有no-cache、expired、no-store、private、auth)

gzip_comp_level(设置响应时的压缩比,1-9个级别,默认1)

二、操作及相关要点(1、反向代理;2、负载均衡;3、缓存;4、rewrite和referer;5、读写分离):

准备:

node1(192.168.41.134 安装nginx)

node2(192.168.41.135 安装httpd)

node3(192.168.41.136 安装httpd)

1、反向代理:

在《第三阶段(十五)理解LNMP》中,提供的对fastcfgi的反向代理:

location ~ \.php$ {

root           html;

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

include        fastcgi_params;

}

syntax:proxy_pass  URL;

(1)实现对主页反向代理(将location中root换为proxy_pass):

node1-side:

[[email protected] ~]# vim /etc/nginx/nginx.conf

server {

listen       80;

server_name  www.magedu.com;

location / {

proxy_pass http://192.168.41.135:80;

}

……

}

node2-side:

[[email protected] ~]# cd /var/www/html

[[email protected] html]# cat index.html

RS1.magedu.com

[[email protected] html]# service httpd status

httpd (pid 10858) 正在运行...

(2)实现对指定的URI反向代理:

node1-side:

[[email protected] ~]# cd /etc/nginx

[[email protected] nginx]# vim nginx.conf

location /forum {

proxy_pass http://192.168.41.135:80/bbs;

}

node2-side:

[[email protected] html]# cd

[[email protected] ~]# cd /var/www/html

[[email protected] html]# mkdir bbs

[[email protected] html]# echo "bbs.magedu.com" > bbs/index.html

测试时在浏览器上输入URL会自动跳转至后端192.168.41.135/bbs

(3)若在location中使用模式匹配,则在proxy_pass所指定的后端server上不能使用uri路径,否则提示配置文件语法错误:

node1-side:

[[email protected] nginx]# vim nginx.conf(此例中/forum会自动附加在后端server上,如http://192.168.41.134/forum-->http://192.168.41.135/forum;proxy_set_header指令表示将用户请求转至后端服务器上时构建首部信息,目的在后端server上的访问日志记录的是client自身IP而不是代理的IP,为方便以后分析使用(若不添加此项后端server记录的是代理的地址,以后分析这些数据是没意义的);$remote_addr表示client地址,是nginx core模块提供的变量,core模块提供的变量有很多,如$remote_port,$remote_user,$request_filename,$request_body,$request_method,$request_uri,$schema,$server_addr,$server_name,$server_port,$server_protocol,$uri等等,可以直接引用)

location ~* ^/forum {

proxy_pass http://192.168.41.135:80;

proxy_set_header X-Real-IP $remote_addr;

}

[[email protected] nginx]# !service

service nginx reload

nginx: the configuration file/etc/nginx/nginx.conf syntax is ok

nginx: configuration file/etc/nginx/nginx.conf test is successful

重新载入 nginx:                                           [确定]

node2-side:

[[email protected] html]# mkdir forum

[[email protected] html]# echo "forum.magedu.com" > forum/index.html

[[email protected] html]# vim /etc/httpd/conf/httpd.conf(更改如下配置,真正实现让后端server记录的日志中是真正的client地址)

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined

[[email protected] html]# !service

service httpd restart

停止 httpd:                                              [确定]

正在启动 httpd:                                           [确定]

[[email protected] html]# tail -2 /var/log/httpd/access_log(第一条记录是更改前的是代理的地址,第二条记录则是真正client的地址,由于此处虚拟机网络设置的是NAT模式(我工作的场所需要安装iNODE客户端才能连接公司内网,所以只有虚拟机设置了NAT模式才能与本机连接)所以显示的是网关,这里就不再更改网络配置了)

192.168.41.134 - - [23/Dec/2015:06:05:59+0800] "GET /forum/ HTTP/1.0" 304 - "-" "Mozilla/5.0(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.26Safari/537.36 OPR/32.0.1948.4 (Edition beta)"

192.168.41.1 - - [23/Dec/2015:06:07:51+0800] "GET /forum/ HTTP/1.0" 304 - "-" "Mozilla/5.0(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.26Safari/537.36 OPR/32.0.1948.4 (Edition beta)"

2、负载均衡load balance:

upstream

将后端多个服务器归并为一组,在组中定义LB调度算法;

在http{}之内server{}之外定义;

upstream中的server定义每一个后端服务器,server之后只能跟IP或名称不能加入http://,之后还可跟其它参数,如weight=NUM、max_fails=NUM、fail_timeout=TIME、backup,其中有weight表示使用rr算法,默认值是1,若没写weight,server上方也没写schedule表示此server不参加LB;backup(类似keepalived中的sorry_server)表示备用服务器,可用于RS全挂掉后在反向代理服务器上提供错误页面;

schedule调度算法(rr、ip_hash、least_conn),默认roundrobin,ip_hash(始终将同一client的请求转至同一RS)

node1-side:

[[email protected] nginx]# !vim(websrvs为自定义的组名)

vim nginx.conf

upstream websrvs {

server 192.168.41.135 weight=1 max_fails=2 fail_timeout=2;

server 192.168.41.136 weight=1 max_fails=2 fail_timeout=2;

server 127.0.0.1:8080 backup;

}

server {

listen       80;

server_name  www.magedu.com;

location / {

proxy_pass http://websrvs;

proxy_set_header X-Real-IP$remote_addr;

}

}

server {

listen 8080;

server_name localhost;

location / {

root /web/errorpages;

index index.html;

}

}

[[email protected] nginx]# mkdir /web/errorpages-pv

mkdir: 已创建目录"/web/errorpages"

[[email protected] nginx]# echo "Sorry,the server is maintaining" > /web/errorpages/index.html

[[email protected] nginx]# !service

service nginx reload

nginx: the configuration file/etc/nginx/nginx.conf syntax is ok

nginx: configuration file/etc/nginx/nginx.conf test is successful

重新载入 nginx:                                           [确定]

node3-side:

[[email protected] ~]# cd /var/www/html

[[email protected] html]# vim index.html

[[email protected] html]# echo "RS2.magedu.com" > index.html

[[email protected] html]# service httpd start

正在启动 httpd:                                           [确定]

测试:

[[email protected] html]# service httpd stop

停止 httpd:                                              [确定]

[[email protected] html]# service httpd stop

停止 httpd:                                               [确定]

若schedule使用ip_hash,则不能使用backup,否则会报配置文件语法错误:

upstream websrvs {

ip_hash;

server 192.168.41.135 max_fails=2 fail_timeout=2;

server 192.168.41.136 max_fails=2 fail_timeout=2;

}

[[email protected] nginx]# netstat -tnlua | awk ‘/:80/{S[$NF]++}END{for (A in S) print A,S[A]}‘

TIME_WAIT 4

ESTABLISHED 1

LISTEN 2

LB扩展(当后端有不同的服务器组,如app-server组处理动态内容,image-server组,file-server组):

upstream phpsrvs  {

server……;

server……;

}

location ~*  \.php$  {

fastcgi_pass  http://phpsrvs;

}

upstream imagesrvs  {

server……;

server……;

}

location ~*  “\.(jpg|jpeg|png|gif)$”  {

proxy_pass  http://imagesrvs;

}

upstream filesrvs  {

server……;

server……;

}

location /  {

root  /web/htdoc;

index  index.html;

}

3、缓存:

nginx有两类缓存cache:共享内存,主要用于键存储(缓存的查找键key)及缓存对象的元数据;磁盘空间(存储数据)

proxy_cache_path在http{}之内server{}之外定义,该指令定义的是nginx有缓存功能(缓存能力),但具体谁要用到缓存要在location{}中使用proxy_cache指令定义

注:缓存是分级的,浏览器自己的缓存是私有缓存(private cache),而nginx的缓存是公共的(public cache,所有用户都可用)

注:nginx不仅可以缓存web object(见以下举例),也可为日志提供缓存功能(client的每次访问都要记入日志,为日志打开缓冲区),还可为fastcgi打开缓存功能

open_log_cache(日志缓存,先写入内存中,在适当时间再同步到文件中)

open_file_cache(打开文件缓存,nginx作为server,要处理用户所请求的内容,要打开很多文件响应给用户,尤其是元数据,打开后缓存在nginx所管理的内存中,加速响应过程)

fastcgi_cache(慎用,若第一次将php的执行结果缓存好,之后后端server的处理逻辑改了,这时响应的还是之前的内容)

注:nginx的limit也基于共享内存实现

syntax:

proxy_cache_path  PATH [levels=LEVELS] keys_zone=NAME:SIZE [max_size=SIZE];

其中levels=LEVELS(定义缓存目录(子目录级别,子目录级别最多三级且每级目录名最多两个字符),目的使命名方式简单,如要缓存1000W万个对象,若都放到一个目录下则需要有1000W个变化,命名会复杂,若一级子目录有10个,则每个子目录下有100W个对象,再分二级、三级子目录,则其下的每个子目录有1W个对象,不仅使得命名容易也使定位查找更快,而且路径引用也不复杂)

例:levels=1:2(1表示一级子目录,2表示二级子目录;同时1又表示一级子目录由1个字符组成,2同时又表示二级子目录由2个字符组成,最多可有三级子目录,每级子目录最多2个字符),常用的有levels=1:2、levels=1:2:1、levels=1:1:1

keys_zone=NAME:SIZE(给共享内存命名,重要,此处的名字要被使用缓存者引用)

max_size=SIZE(缓存空间并不是越大越好,大了管理会复杂,小了清理缓存会降低命中率(缓存空间若存满了,由cache_manager根据LRU算法将之前没用到的缓存清理掉,若刚清出去又要用,这就未命中,又要重新获取),空间多大合适,要根据实际情况测试,如果增大空间命中率提升,则这个空间就要加大)

proxy_cache ZONE_NAME;(define a shared memory zone used for caching)

proxy_cache_valid  [CODE] TIME;(sets caching time for different response codes)

[[email protected] nginx]# !vim

vim nginx.conf

proxy_cache_path /etc/nginx/cache/first levels=1:2:1 keys_zone=first:20m max_size=1g;

upstream websrvs {

server 192.168.41.135 weight=1 max_fails=2 fail_timeout=2;

server 192.168.41.136 weight=1 max_fails=2 fail_timeout=2;

server 127.0.0.1:8080 backup;

}

server {

listen       80;

server_name  www.magedu.com;

location / {

proxy_pass http://websrvs;

proxy_set_header X-Real-IP $remote_addr;

proxy_cache first;

proxy_cache_valid 200 10m;

}

}

[[email protected] nginx]# mkdir cache/first -pv

mkdir: 已创建目录 "cache"

mkdir: 已创建目录"cache/first"

[[email protected] nginx]# service nginx reload

验证:测试时因为缓存命中了,LB也不起作用将不再找后端server,使用浏览器快捷键ctrl+F5(或shift+F5)可控制不使用浏览器自身缓存(在开发者工具:request headers:no-cache),使用add_header(每一次构建响应时为client增加新的标签)这样在client就可看出缓存是否命中

[[email protected] nginx]# !vim($server_addr服务器地址,$upstream_cache_status状态有HIT、MISS、EXPIRED、BYPASS、UPDATING、STALE、REVALIDATED)

vim nginx.conf

server {

listen       80;

server_name  www.magedu.com;

add_header X-Via $server_addr;

add_header X-Cache $upstream_cache_status;

location / {

proxy_pass http://websrvs;

proxy_set_header X-Real-IP $remote_addr;

proxy_cache first;

proxy_cache_valid 200 10m;

}

}

注:此处语句可合并为:add_header X-Cache “$upstream_cache_status from $server_addr”;

$upstream_cache_status(该变量是ngx_http_upstream_module提供的)

$server_addr(该变量是由ngx_http_core_module提供的)

[[email protected] nginx]# service nginx stop

停止 nginx:                                              [确定]

[[email protected] nginx]# ls cache/first/2/b3/7/bc9c9eed354a58d3c2bde97d0a7d7b32

[[email protected] nginx]# rm -rf cache/first/*(将缓存删除,再次重新验证)

[[email protected] nginx]# service nginx start

正在启动 nginx:                                           [确定]

再次ctrl+F5刷新

[[email protected] nginx]# cp nginx.conf nginx.conf.example

[[email protected] nginx]# cp nginx.conf.default nginx.conf

cp:是否覆盖"nginx.conf"? y

4、rewrite和referer:

ngx_http_rewrite_module支持正则表达式,指令有break、return、rewrite、if

if (condition) {……}

测试:单目;双目(=|!=|~|!~|~*|!~*)

注:~,区分字符大小写,匹配为真,不匹配为假;!~,区分字符大小写,不匹配为真,匹配为假;~*,不区分字符大小写,匹配为真,不匹配为假;!~*,不区分字符大小写,不匹配不真,匹配为假;=,精确匹配,匹配为真,不匹配为假;!=,精确匹配,不匹配为真,匹配为假

例:if ($request_method = “POST”) {}

if ($request_uri ~* “/forum” {}

rewrite REGEX  REPLACEMENT  [FLAG];(用在server、location和if上下文中)

FLAG有四个值:

last(本次重写完成之后,重启下轮检查)

break(本次重写结束之后,直接执行后续操作,通常在某个非根下使用break)

redirect(302,临时重定向,returns a temporary redirect with the 302 code)

permanent(301,永久重定向,returns a permanent redirect with the 301 code)

例1(跨服务器重定向):

[[email protected] nginx]# vim nginx.conf

location / {

root   html;

index  index.html index.htm;

rewrite ^/bbs/(.*)$ http://192.168.41.135/forum/$1;

}

[[email protected] nginx]# service nginx restart

[[email protected] html]# cat /var/www/html/forum/index.html

forum.magedu.com

测试:

例2(本机内重定向,隐式重定向,client看不出来状态码正常200):

[[email protected] nginx]# !vim

vim nginx.conf

location / {

root   html;

index  index.html index.htm;

rewrite ^/bbs/(.*)$ /forum/$1;

}

[[email protected] nginx]# mkdir /usr/html/forum

[[email protected] nginx]# echo "the serveris nginx,134" > /usr/html/forum/index.html

[[email protected] nginx]# !service

补充:若出现循环,则会持续定向10次自动退出,如:

rewrite  “^/bbs/(.*)/images/(.*)\.jpg$”  http://www.magedu.com/bbs/$2/images/$1.jpg  last;

ngx_http_referer_module(ngx_http_referer_moduleis used to block access to a site for requests with invalid values in the “referer”header field,定义哪些引用有效,防盗链,常用的指令valid_referers(定义有效的引用,specifies the “referer” request header field values that will causethe embedded $invalid_referer variable to be set to an empty string)

例:

location /photos/  {

valid_referers  none blocked  www.mydomain.com  mydomain.com;

if ($invalid_referer)  {

return  403;

}

}

注:none(在地址栏输入的,the “referer” field is missing in the request header)

blocked(类似启用防火墙法则,只要valid_referers这行中没有定义的就是不合法的,the “referer” field is present in the request header,but its valuehas been deleted by a firewall or proxy server; such values are strings that donot start with http://or https://)

5、读写分离(指定仅允许后端某一server可上传文件,后端另一server可访问):

webDAV(web-based distributed authoring and versioning),一种基于HTTP/1.1的通信协议,并扩展了HTTP/1.1,在GET、POST、HEAD等几个HTTP方法以外添加了一些新的方法,使应用程序可直接对web server直接读写,并支持写文件锁定locking和解锁unlock,还可支持文件的版本控制

node2-side:

[[email protected] html]# vim /etc/httpd/conf/httpd.conf

……

LoadModule dav_module modules/mod_dav.so

LoadModule dav_fs_modulemodules/mod_dav_fs.so

<Directory"/var/www/html">

……

Dav on

……

</Directory>

[[email protected] html]# service httpd restart

[[email protected] html]# setfacl -m u:apache:rwx /var/www/html

[[email protected] html]# getfacl /var/www/html

getfacl: Removing leading ‘/‘ from absolutepath names

# file: var/www/html

# owner: root

# group: root

user::rwx

user:apache:rwx

group::r-x

mask::rwx

other::r-x

node3-side:

[[email protected] ~]# cat /var/www/html/index.html

RS2.magedu.com

node1-side:

[[email protected] nginx]# !vim

vim nginx.conf

location / {

proxy_pass http://192.168.41.136;

if ($request_method ="PUT") {

proxy_pass http://192.168.41.135;

}

}

[[email protected] nginx]# !service

service nginx reload

nginx: the configuration file/etc/nginx/nginx.conf syntax is ok

nginx: configuration file/etc/nginx/nginx.conf test is successful

验证:读取

验证:上传

[[email protected] nginx]# curl -T /etc/hosts http://192.168.41.134(上传文件)

<!DOCTYPE HTML PUBLIC "-//IETF//DTDHTML 2.0//EN">

<html><head>

<title>201 Created</title>

</head><body>

<h1>Created</h1>

<p>Resource /hostshas been created.</p>

<hr />

<address>Apache/2.2.15 (Red Hat)Server at 192.168.41.135 Port 80</address>

</body></html>

注:此处未将135、136做同步,所以只能直接访问192.168.41.135/hosts

以上是学习《马哥运维课程》做的笔记

时间: 2024-12-18 23:07:48

Linux运维 第三阶段 (十六) nginx(2)的相关文章

Linux运维 第三阶段 (六) 搭建LAMP环境

Linux运维 第三阶段(六) 搭建LAMP环境 环境:RHEL6 X386或X86_64,其中64位在此文中已用()标明注意事项. 一.准备工作 1.安装编译工具gcc.gcc-c++ 注意解决依赖关系,推荐使用yum安装,若不能联网可使用安装光盘做为yum源-- # yum -y install gcc # yum -y install gcc-c++ 2.关闭系统RPM安装包的Apache.MySQL的服务 关闭启动的服务httpd.mysqld #service httpd stop #

Linux运维 第三阶段 (十九) varnish(1)

Linux运维 第三阶段 (十九) varnish 一.相关概念: http/1.0-->http/1.1(重大改进:对缓存功能实现了更精细化的设计) RFC(request file comment,每一种协议都有请求注解文档,讲协议规范) http页面由众多的web object组成,有些是静态,有些是通过程序执行后生成的:为加速web的访问,browser中引入了缓存机制,能将访问的静态内容或可缓存的动态内容缓存到本地,而后client再次到原始server上请求之前相同的内容时,如果原始

Linux运维 第三阶段 (十二)tcp wrapper

Linux运维第三阶段(十二)tcp wrapper tcp wrapper tcp wrapper(工作在TCP层的访问控制工具,通常只对TCP协议的应用做控制,它本身只是个库文件libwrap.so(由glibc提供)) 当来自客户端的请求访问本机服务时,请求先到达本机网卡,再到内核TCP/IP协议栈,路由发现是访问本机的,转至用户空间服务所监听的套接字上,服务响应送至内核TCP/IP协议栈,再通过路由经网卡返回至客户端:有了tcp wrapper后,在这过程当中附加了一层访问控制机制,由t

Linux运维 第三阶段 (二十) tomcat

一.相关概念(1.编程语言:2.servlet.jsp:3.tomcat): tomcat(app-server server) 为提高tomcat工作性能,前端要引入很多组件(如cache server(varnish)同样对它生效) 1.编程语言: php相关框架.网站程序设计涉及到的基本内容: php: 开发语言,脚本语言,动态语言: 安装的php是个运行环境: 用php开发语言开发网站程序,这个程序在运行环境中解释执行,若每条指令都解释执行.每个用户请求的动态内容都解释执行这将非常慢:在

Linux运维 第三阶段 (十七) memcached

一.相关概念: memcached.org(live journal站点贡献的),很多流行站点都在用,如wikipedia.twitter.youtube.mixi等,memcached是非常流行的缓存服务,众多的应用程序开发基本都支持memcached缓存(C有C库,C++有C++库,php有php库,开发时都可直接调用memcached功能,若某个应用程序开发时不用memcached,它就不能往memcached中缓存数据,缓存数据与否取决于app自身,由app决定缓不缓存用不用它) mem

Linux运维 第三阶段 (七) NFS

Linux运维 第三阶段 (七) NFS配置 1,服务器端软件:安装nfs-utils和portmap(rpcbind)nfs-utils: 提供rpc.nfsd 及 rpc.mountd这两个NFS DAEMONS的套件 portmap: NFS其实可以被看作是一个RPC SERVER PROGRAM,而要启动一个RPC SERVER PROGRAM,都要做好PORT的对应工作,而且这样的任务就是由PORTMAP来完成的.通俗的说PortMap就是用来做PORT的mapping 的.NFS需要

Linux运维 第三阶段 (十三)nss&pam

Linux运维第三阶段(十三)nss&pam 一.nss(network service switch网络服务转换) authentication(认证,决定用户的用户名和密码是否能通过检验) authorization(授权,决定用户是否能访问某服务) audition(审计) username-->UID groupname-->GID http-->80port FQDN-->IP(hosts文件,DNS,mysql,NIS(networkinformation se

Linux运维 第三阶段 (十一)iptables

Linux运维第三阶段(十一)iptables iptables linux防火墙:netfilter(框架framework):iptables(生成防火墙规则并将其附加在netfilter上,真正实现数据报文过滤.NAT.mangle等规则生成的工具):真正起作用的是规则,规则放在netfilter上才能生效 网络防火墙的功能根据TCP/IP首部实现的 IP报文(见文末附图): fragment ID(段标识) MF(more fragment) DF(don't fragment,单个报文

Linux运维 第三阶段 (三) vsftpd服务

Linux运维 第三阶段 (二) vsftpd服务 1.FTP(filetransfer protocol),以TCP数据包的模式进行服务器与客户端之间的文件传输: 数据连接:TCP20,用于上传下载数据:TCP21,用于发送FTP命令信息: 数据连接的建立类型:主动模式(服务端从20端口主动向客户端发起连接):被动模式(服务端在指定范围内某个端口被动等待客户端连接): FTP的用户类型:匿名用户(anonymous或ftp):本地用户(账号密码等信息保存在/etc/passwd./etc/sh