官网 常用模块介绍 nginx代理
为什么用Nginx?
(1)跨平台、配置简单; (2)非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发; (3)内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术; (4)nginx处理静态文件好,耗费内存少; (5)内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。 (6)节省宽带:支持GZIP压缩,可以添加浏览器本地缓存; (7)稳定性高:宕机的概率非常小 (8)master/worker结构:一个master进程,生成一个或者多个worker进程。 (9)接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力; (10)一边接收web服务器的返回数据,一边发送给浏览器客户端; (11)网络依赖性比较低,只要ping通就可以负载均衡; (12)事件驱动:通信机制采用epoll模型。
nginx和Apache的区别?
两者最核心的区别在于apache是同步多进程模型,一个request对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。 一般来说,需要性能的web服务,用nginx,如果不需要性能只求稳定,更考虑Apache,后者的各种模块实现的比前者好很多,epoll网络IO模型是nginx处理性能高的根本,但并不是所有情况下epoll大获全胜的,如果本身提供静态服务的只有几个文件,apache的select模型或许比epoll更高性能。当然,这只是一个假设,真正还需要实测了再说。 更通用的方案是,前端nginx抗并发,后端apache集群,配合起来会更好。
工作模式
nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
master-worker
该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:
稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务单进程模式
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
nginx大部分常用模块,编译时./configure --help 以–without开头的都默认安装。 –prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx –conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行 中的-c选项。默认为prefix/conf/nginx.conf –user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。 默认的用户名是nobody。–group=name类似 –with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使 用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 - 8.30)并解压,剩下的就交给Nginx 的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。 –with-zlib=PATH : 指定 zlib(版本1.1.3 - 1.2.5)的源码解压目录。在默认就启用的网络传输压缩 模块ngx_http_gzip_module时需要使用zlib 。 –with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与 openssl-devel已安装 –with-http_stub_status_module : 用来监控 Nginx 的当前状态 –with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如XReal-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址 –add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模 块都要重新编译(Tengine可以在新加入module时无需重新编译)
#1.下载nginx #2.tar zxf nginx-1.14.0.tar.gz #3.cd nginx-1.14.0 ##讲解里面各目录的意义 1)auto目录:里面有4个子目录,cc是编译使用的,os是判断操作系统类型的,其他都是辅助configure编译的, 也就是操作系统有什么特性供nginx使用 2)CHANGES:各版本的改变,bug修复等信息 CHANGES.ru:nginx作者是俄罗斯人,这是俄罗斯版本 3)conf: 为了方便运维配置,conf目录里有示例文件,安装好后会拷贝到安装目录 4)configure: 5)contrib:提供nginx语法检测字体 cp -r contrib/vim/* ~/.vim ##家目录下如果没有.vim目录,手动新建 6)html:默认发布目录,50x.html是报500错误时的页面 7) src:源码目录 8) 编译完成后会生成一个中间目录objs,里面有个ngx_modules.c,表示编译进nginx的模块,可以打开看一下 9) make完成后再看objs目录,又有新文件 #4.编译 ./configure --prefix=/usr/local/nginx --with-file-aio 前面lnmp部分已经讲过正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端才能使用正向代理。举个例子说明一下: 在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时需要找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们! 上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
总结
总结来说:正向代理,“它代理的是客户端,代客户端发出请求”,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 正向代理的用途: (1)访问原来无法访问的资源,如Google (2) 可以做缓存,加速访问资源 (3)对客户端访问授权,上网进行认证 (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说,就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。 举个例子说明一下: 某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine。那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图
总结
此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。 客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理,它代理的是服务端,代服务端接收请求",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。 反向代理的作用: (1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网 (2)负载均衡,通过反向代理服务器来优化网站的负载
通常上网访问路径(比如说用阿里云主机): client() --> ADSL(拨号上网) --> cdn --> SLB(阿里云负载均衡) --> nginx
1.重新编译添加模块 ./configure --prefix=/usr/local/nginx --with-http_realip_module make cd /root/nginx-1.15.8/objs cp -f nginx /usr/local/nginx/sbin/nginx 2.添加虚拟主机 vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name server1.example.org; ##添加域名 set_real_ip_from 172.25.136.1; ##真实服务器上一级代理的IP地址或者IP段,可以写多行 real_ip_header X-Forwarded-For; real_ip_recursive on; ##这里off就获取不到源地址,可以先改为off看效果,再打开 location / { return 200 "client real ip: $remote_addr\n"; } } ———————————————————————————————— #尝试访问 nginx -s reload curl -I server1.example.com curl -H "X-Forwarded-For: 1.1.1.1,172.25.136.1" server1.example.org ##X-Forwarded-For可以保存每一级的ip头,结果可以获取到server1的ip 3.反向代理 ##深入:自己再开一台虚拟机模拟反向代理,测试这个配置是否生效 server1配置: ###就写在配置文件本来的sever下面就行了 server { listen 80; server_name localhost; set_real_ip_from 172.25.136.2; real_ip_header X-Forwarded-For; real_ip_recursive on; —————————————————————————— server2配置(做代理): upstream westos { server 172.25.136.1:80; #上游真实服务器 } server { listen 80; server_name www.westos.org; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://westos; } } —————————————————————— nginx -s reload 再用物理机访问www.westos.org,然后在server1上查看access.log,可以看到请求来自物理机 ##注意物理机要添加反向代理主机的dns off的时候就是来自反向代理主机不管一个系统或网站的大与小,都存在相应的图片处理,生成缩略图、为图片加水印等等,如果涉及到APP端,这个图 片的处理需求变得更加重要了,因为在目前看来,客户端的屏幕大小不一,会导致以下问题: 1、图片过大导致APP加载图片速度慢; 2、消耗用户过多流量。 添加图片过滤模块(有时一张高清图片太大,页面加载时间太长,需要压缩)
1.需要重新编译nginx ./configure --prefix=/usr/local/nginx --with-http_realip_module --withhttp_image_filter_module=dynamic 编译报错,没有gd-devel包 yum list gd ##看到系统gd版本是2.0.35-26,所以自己下载的gd-devel也得是这个版本 yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm 再编译 make cd /root/nginx-1.15.8/objs cp nginx /usr/local/nginx/sbin/ 静态模块需要手动新建目录,把模块放进去 mkdir /usr/local/nginx/modules cp ngx_http_image_filter_module.so /usr/local/nginx/modules/ 修改配置文件 load_module modules/ngx_http_image_filter_module.so;##加在最开头 location /download/ { limit_conn addr 1; #limit_rate 50k; #limit_req zone=one burst=5; image_filter resize 150 100; #就是重新调整图片的尺寸(像素) } 然后在浏览器上打开访问,没有变化先清理缓存 http://ip/download/xxx.jpg #注意:路径一定要输入全,图片位置要对 按F12,点击network->file可以看到图片大小变为不到2k,之前400多k调整用户浏览的URL,看起来规范 合乎开发及产品人员的需求 为了让搜索引擎收录网站内容,让用户体验更好 企业会将动态URL地址伪装成静态地址提供服务 网站更换新域名后 例如,访问京东的360buy.com会跳转到jd.com 根据特殊的变量、目录、客户端信息进行跳转 URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中
================================================================================ rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记 关键字:其中关键字error_log不能改变 正则:perl兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记 flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 例子: rewrite ^/(.*) http://www.czlun.com/$1 permanent; 说明: rewrite为固定关键字,表示开始进行rewrite匹配规则 regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址 replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。 flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上 ================================================================================ ########################################### . : 匹配除换行符以外的任意字符 ? : 重复0次或1次 例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}" + : 重复1次或更多次 如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” * : 重复0次或更多次 #如“ol*”能匹配“o”及“ol”、“oll” \d :匹配数字 ^ : 匹配字符串的开始 $ : 匹配字符串的结束 {n} : 重复n次 {n,} : 重复n次或更多次 [c] : 匹配单个字符c [a-z] : 匹配a-z小写字母的任意一个 ###########################################实现http—>https(重定向1)
location 是在 server 块中配置。可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。 vim nginx.conf server { listen 443 ssl; server_name localhost; ssl_certificate cert.pem; ssl_certificate_key cert.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /web; index index.html index.htm; } } server { listen 80; server_name www.westos.org; rewrite ^/(.*)$ https://www.westos.org/$1; ##$1表示用户在这里输入的内容保留,只会重定向$1前面的 #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; 永久重定向(可以缓存,临时的不允许缓存) } ## permanent 返回301永久重定向#再加一台虚拟主机
server { listen 443 ssl; server_name www.westos.org bbs.westos.org; ssl_certificate cert.pem; ssl_certificate_key cert.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; #location / { # root /web; # index index.html index.htm; #} location / { root /bbs; index index.html; } } mkdir /bbs vim /bbs/index.html <h1>bbs.westos.org</h1> nginx -s reload 重新重定向(2) server { listen 80; server_name www.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; rewrite ^/bbs$ https://bbs.westos.org/index.html permanent; #表示访问www.westos.org并且以bbs结尾的,都定向到https://bbs.westos.org } 重定向3 server { listen 80; server_name bbs.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; rewrite ^/bbs$ https://bbs.westos.org permanent; rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; } #浏览器测试:是bbs.westos.org对应的根目录 '先匹配第一条重写规则定向到bbs.westos.org,然后再定向到下一条规则' 重定向4:整合 server { listen 80; server_name www.westos.org bbs.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; #rewrite ^/bbs$ http://bbs.westos.org permanent; #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; if ($host = "bbs.westos.org") { #$host : 请求主机头字段,否则为服务器名称 rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; } location / { root /web; index index.html; } } nginx -s reload cd /web/ cp -r /bbs/ . 测试:curl -I bbs.westos.org准确的说,只有某些时候,这种跨站访问资源,才被称为盗链。假设B站点作为一个商业网站,有很多自主版权的图片,自身展示用于商业目的。而A站点,希望在自己的网站上面也展示这些图片,直接使用。常见的防盗链系统,一般使用在图片、音视频、软件等相关的资源上。
提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。 如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区别对待。如果网站服务器用的是apache,那么使用apache自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理是检查refer,如果refer的信息来自其他网站则重定向到指定图片或网页上。 如果服务器使用的是IIS的话,则需要通过第三方插件来实现防盗链功能了,现在比较常用的一款产品叫做ISAPI_Rewrite,可以实现类似于apache的防盗链功能。另外对于论坛来说还可以使用“登录验证”的方法进行防盗链。
1.先配置盗链 server1上的vim.jpg被盗链,server2是盗链者 server1上不需要改变什么配置,只用把www.westos.org这个域名保留 在server2上修改虚拟主机配置: server { listen 80; server_name daolian.westos.org; charset utf-8;#不加这个参数网页上看到的汉字是乱码 location / { root /web; index index.html; } } 在物理机和各节点都配置解析 172.25.136.2 daolian.westos.org vim /web/index.html <html> <body> <br>盗链图片</br> <img src="http://www.westos.org/vim.jpg"> </body> </html> server1上需要把vim.jpg资源放到/web目录 server:nginx.conf server { listen 80; server_name www.westos.org bbs.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; #rewrite ^/bbs$ http://bbs.westos.org/index.html permanent; #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #if ($host = "bbs.westos.org") { # rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; # } location / { root /web; index index.html; } } 访问: http://daolian.westos.org 发现访问到了server1上的vim.jpg资源,这就是盗链 2.#配置防盗链 server1上修改配置: vim nginx.conf server { listen 80; server_name www.westos.org ; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; #rewrite ^/bbs$ http://bbs.westos.org permanent; #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #if ($host = "bbs.westos.org") { # rewrite ^/(.*)$ http://www.westos.org/$1 permanent; #} location / { root /web; index index.html; } location ~* \.(gif|jpg|png|jpeg)$ { root /web; valid_referers none blocked www.westos.org; if ($invalid_referer) { return 403; } } } 当访问域名为www.westos.org时正常访问,否则返回一个不可见小图标 3.#再优化防盗链配置,添加重定向规则 vim nginx.conf location ~* \.(gif|jpg|png|jpeg)$ { root /web; valid_referers none blocked www.westos.org; if ($invalid_referer) { rewrite ^/(.*)$ http://bbs.westos.org/daolian.jpg;##放置警告标语 } } } server { listen 80; server_name bbs.westos.org; location / { root /bbs; index index.html; } } 当盗链访问server1时,重定向到另外一张图片,作出警告