阅读 3226

RE|Nginx-安装与配置(1)

Nginx

本文里面介绍了 Nginx的安装,代理,负载均衡,location的正则配置,动静分离,缓存,压缩,防盗链,跨域处理

1. 定义:

Nginx 是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP/UDP代理服务器。

2. 简介

  • Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

3. 安装

Windos安装:

  1. 下载nginx nginx.org/download/ng…

  2. 双击启动nginx程序

Linux安装:

在linux下面存在两种安装方式:

  1. 编译安装
  2. yum安装

Yum安装 【centOs7才有Yum】:

  1. 如果没有安装 Nginx 的源需要安装一下Nginx的源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
复制代码

[1] Yum 安装 Nginx

yum install nginx
复制代码

[2] 命令 Nginx 启动 Nginx服务

nginx
复制代码

[3] nginx的路径如下

(1) Nginx配置路径:/etc/nginx/

(2) PID目录:/var/run/nginx.pid

(3) 错误日志:/var/log/nginx/error.log

(4) 访问日志:/var/log/nginx/access.log

(5) 默认站点目录:/usr/share/nginx/html
复制代码

编译安装

  1. 下载nginx
wget http://nginx.org/download/nginx-1.15.12.tar.gz
复制代码
  1. 安装需要编译的插件

Gcc:yum install gcc c++ (用于编译c、c++代码)
Pcre:yum install -y pcre pcre-devel (用c语言编写的正则表达式函数库))
Zlib:yum install -y zlib zlib-devel (用于数据压缩的函式库))
OpenSSL:yum install -y openssl openssl-devel (安全套接字层密码库))

yum install -y pcre pcre-devel
yum install -y zlib zlib-devel 
yum install -y openssl openssl-devel  
复制代码
  1. 编译Nginx
tar -zxvf nginx-1.15.tar.gz
cd nginx-1.15
./configure
make
make install
复制代码
  1. 启动nginx
cd /usr/local/nginx/
cd sbin/
./nginx 
复制代码

3. 代理

正向代理:正向代理代理的是用户

反向代理:方向代理代理的是服务器

4. 准备

我们要演示Nginx的相关配置需要3台服务器,里面用Tomcat。为了我们区分我们在每个Tomcat里面的index.jsp里面写入的本机的Ip。启动Tomcat,出现如下效果。

我们随机选择其中一台,修改里面的 nginx.conf

# http://10.18.3.197/ 代理

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    proxy_pass http://127.0.0.1:8080;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
复制代码

那么代理了本机8080端口的数据

接下来我们使用windos的本机的Host劫持

进入 C:\Windows\System32\drivers\etc 这个文件
修改 hosts 文件
在里面添加 10.18.3.197 test.com
复制代码

我们浏览器访问如图:

我们准备好了环境和相关配置那么我们接下来看Nginx的一些配置。

5. location配置

location = /uri 精准匹配
location ^~ /uri 前缀匹配
location ~ /uri
location / 通用匹配

举个例子:
1 location = /
2 location = /index
3 location ^~ /article/
4 location ^~ /article/files/
5 location ~ .(gif|png|js|css)$
6 location /
http://10.18.3.197/
http://10.18.3.197/index ->2
http://10.18.3.197/article/files/1.txt ->4
http://10.18.3.197/mic.png ->5

6. Nginx的插件的使用

# 使用编译安装的时候插件的安装按时
./configure --prefix=/安装目录 --add-module = /第三方模块的目录 <br/>
./configure --prefix=/data/program/nginx --with-http_stub_status_module --withhttp_random_index_module
cp objs/nginx $nginx_home/sbin/nginx
复制代码

举个例子

安装 http_stub_status_module

# 查看nginx的状态
location /status {
    stub_status;
}
复制代码

Active: connections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
Writing:当前状态,正在向客户端发送响应报文过程中的连接数
Waiting:当前状态,正在等待客户端发出请求的空闲连接数

7.Nginx负载均衡

一、 轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。


# 负载均衡默认的轮询算法
upstream webserver {
	server 10.18.14.59:8080;
   	server 10.18.14.109:8080;
	server 10.18.3.197:8080;
}

server {
    ...
    location / {
    	   # proxy_pass http://127.0.0.1:8080;
               proxy_pass http://webserver;
            }
    }
    ...
}

复制代码

每一次的刷新浏览器里面的地址,得到都是一个新的服务器的IP,进行轮训。
如果我们关闭掉其中的一条服务器,然后去访问我们发现,宕机的那台服务器不会被访问。如果我们再次重启那台宕机的服务器,刷新浏览器的IP地址我们发现又可以负载均衡到那台服务器上面了。

二、 轮询加权

# 负载均轮询加权算法
upstream webserver {
    server 10.18.14.59:8080 weight=2;
    server 10.18.14.109:8080 weight=3;
    server 10.18.3.197:8080 weight=5;
}
复制代码

每台服务器处理的请求数量,跟权重成正比。也就是权重越大,处理的请求数量越多。

三、 ip_hash

如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。我们发我们每一次的刷新并没有分配到其他机器,而是一直在同一台机器上,如果宕机后重新分配后,不在改变。

# 负载均衡ip_hash算法
upstream webserver {
    ip_hash;    #保证每个访客固定访问一个后端服务器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
复制代码

四、least_conn 最小连接数

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

# 负载均衡最小连接数算法
upstream webserver {
    least_conn;    #把请求转发给连接数较少的后端服务器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
复制代码

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

五、fair 响应时间最短

按照服务器端的响应时间来分配请求,响应时间短的优先分配。

# 负载均衡响应时间最短算法
upstream webserver {
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
    fair;    #实现响应时间短的优先分配
}
复制代码

六、url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。 

# 负载均衡url_hash算法
upstream webserver {
    hash $request_uri;    #实现每个url定向到同一个后端服务器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
复制代码

8、相关的配置信息

  • proxy_next_upstream

proxy_next_upstream
语法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];
默认:proxy_next_upstream error timeout;

配置块:http、server、location

这个配置表示当向一台上有服务器转发请求出现错误的时候,继续换一台上后服务器来处理这个请求。 默认情况下,上游服务器一旦开始发送响应数据,Nginx反向代理服务器会立刻把应答包转发给客户端。因此,一 旦Nginx开始向客户端发送响应包,如果中途出现错误也不允许切换到下一个上有服务器继续处理的。这样做的目 的是保证客户端只收到来自同一个上游服务器的应答。

  • proxy_connect_timeout

proxy_connect_timeout
语法: proxy_connect_timeout time;
默认: proxy_connect_timeout 60s;

配置块: http, server, location

用于设置nginx与upstream server的连接超时时间,比如我们直接在location中设置proxy_connect_timeout 1ms, 1ms很短,如果无法在指定时间建立连接,就会报错。

  • proxy_send_timeout

向后端写数据的超时时间,两次写操作的时间间隔如果大于这个值,也就是过了指定时间后端还没有收到数据,连 接会被关闭

  • proxy_read_timeout

从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,那么nginx和后端的链接会被关闭,如果 一个请求的处理时间比较长,可以把这个值设置得大一些

  • proxy_upstream_fail

  • proxy_upstream_fail_timeout

设置了某一个upstream后端失败了指定次数(max_fails)后,在fail_timeout时间内不再去请求它,默认为10秒 语法 server address [fail_timeout=30s]

upstream backend { #服务器集群名字
    server 192.168.218.129:8080 weight=1 max_fails=2 fail_timeout=600s;
    server 192.168.218.131:8080 weight=1 max_fails=2 fail_timeout=600s;
}
复制代码

9.处理跨域问题

什么叫跨域呢?如果两个节点的协议、域名、端口、子域名不同,那么进行的操作都是跨域的,浏览器为了安全问 题都是限制跨域访问,所以跨域其实是浏览器本身的限制。

location / {
    proxy_pass http://webserver;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream error timeout http_500 http_503;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    add_header 'Access-Control-Allow-Origin' '*'; // #允许来自所有的访问地址
    add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS'; //支持的请求方式
    add_header 'Access-Control-Allow-Header' 'Content-Type,*'; //支持的媒体类型
}
复制代码

10.动静分离

必须依赖服务器生存的我们称为动。不需要依赖容器的比如css/js或者图片等,这类就叫静。

静态资源类型

types {
    text/html html htm shtml;
    text/css css;
    text/xml xml;
    image/gif gif;
    image/jpeg jpeg jpg;
    application/javascript js;
    application/atom+xml atom;
    application/rss+xml rss;
    text/mathml mml;
    text/plain txt;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml wml;
    text/x-component htc;
    image/png png;
    image/svg+xml svg svgz;
    image/tiff tif tiff;
    image/vnd.wap.wbmp wbmp;
    image/webp webp;
    image/x-icon ico;
    image/x-jng jng;
    image/x-ms-bmp bmp;
    application/font-woff woff;
    application/java-archive jar war ear;
    application/json json;
    application/mac-binhex40 hqx;
    application/msword doc;
    application/pdf pdf;
    application/postscript ps eps ai;
    application/rtf rtf;
    application/vnd.apple.mpegurl m3u8;
    application/vnd.google-earth.kml+xml kml;
    application/vnd.google-earth.kmz kmz;
    application/vnd.ms-excel xls;
    application/vnd.ms-fontobject eot;
    application/vnd.ms-powerpoint ppt;
    application/vnd.oasis.opendocument.graphics odg;
    application/vnd.oasis.opendocument.presentation odp;
    application/vnd.oasis.opendocument.spreadsheet ods;
    application/vnd.oasis.opendocument.text odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
    pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
    docx;
    application/vnd.wap.wmlc wmlc;
    application/x-7z-compressed 7z;
    application/x-cocoa cco;
    application/x-java-archive-diff jardiff;
    application/x-java-jnlp-file jnlp;
    application/x-makeself run;
    application/x-perl pl pm;
    application/x-pilot prc pdb;
    application/x-rar-compressed rar;
    application/x-redhat-package-manager rpm;
    application/x-sea sea;
    application/x-shockwave-flash swf;
    application/x-stuffit sit;
    application/x-tcl tcl tk;
    application/x-x509-ca-cert der pem crt;
    application/x-xpinstall xpi;
    application/xhtml+xml xhtml;
    application/xspf+xml xspf;
    application/zip zip;
    application/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
    application/octet-stream iso img;
    application/octet-stream msi msp msm;
    audio/midi mid midi kar;
    audio/mpeg mp3;
    audio/ogg ogg;
    audio/x-m4a m4a;
    audio/x-realaudio ra;
    video/3gpp 3gpp 3gp;
    video/mp2t ts;
    video/mp4 mp4;
    video/mpeg mpeg mpg;
    video/quicktime mov;
    video/webm webm;
    video/x-flv flv;
    video/x-m4v m4v;
    video/x-mng mng;
    video/x-ms-asf asx asf;
    video/x-ms-wmv wmv;
    video/x-msvideo avi;
}

复制代码

在Nginx的conf目录下,有一个mime.types文件用户访问一个网站,然后从服务器端获取相应的资源通过浏览器进行解析渲染最后展示给用户,而服务端可以返回各种类型的内容,比如xml、jpg、png、gif、flash、MP4、html、css等等,那么浏览器就是根据mime-type来决定用什么形式来展示的服务器返回的资源给到浏览器时,会把媒体类型告知浏览器,这个告知的标识就是Content-Type,比如ContentType:text/html。


location ~ .*\.(js|css|png|svg|ico|jpg) {
    root /.(路径)./static-resource; # 指定访问的目录
}

复制代码

举个例子:

我们设置拦截静态资源,然后删除本机tomcat里面的静态资源,得到如下:

将我们删除的tomcat静态资源放入对应的文件夹内

动静分离的好处
第一个,Nginx本身就是一个高性能的静态web服务器;
第二个,其实静态文件有一个特点就是基本上变化不大,所以动静分离以后我们可以对静态文件进行缓存、或者压 缩提高网站性能。现在比较流行前后端分离,这样可以大大减轻服务端的压力

12.缓存配置

当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息浏览器缓存将文件保存在客户端,好的缓存策略可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担nginx缓存配置

Nginx缓存配置

Nginx可以通过expires设置缓存,比如我们可以针对图片做缓存,因为图片这类信息基本上不会改变。 在location中设置expires

格式: expires 30s|m|h|d
location ~ .*\.(jpg|jpeg|gif|bmp|png|js|css|ico) {
    root static;
    expires 1d; # 设置过期时间为1天
}
复制代码

13.压缩

我们一个网站一定会包含很多的静态文件,比如图片、脚本、样式等等,而这些css/js可能本身会比较大,那么在 网络传输的时候就会比较慢,从而导致网站的渲染速度。因此Nginx中提供了一种Gzip的压缩优化手段,可以对后 端的文件进行压缩传输,压缩以后的好处在于能够降低文件的大小来提高传输效率。

配置信息

Gzip on|off 是否开启gzip压缩

Gzip_buffers 4 16k #设置gzip申请内存的大小,作用是按指定大小的倍数申请内存空间。4 16k代表按照原始数据 大小以16k为单位的4倍申请内存。

Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源

Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzip

Gzip_min_length #开始压缩的最小长度(小于多少就不做压缩),可以指定单位,比如 1k

Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本

Gzip_proxied (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用 压缩)

Gzip_type text/pliain,application/xml 对那些类型的文件做压缩 (conf/mime.conf)

Gzip_vary on|off 是否传输gzip压缩标识; 启用应答头"Vary: Accept-Encoding";给代理服务器用的,有的浏览器支 持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩


http {
    gzip on;
    gzip_min_length 5k;
    gzip_comp_level 3;
    gzip_types application/javascript image/jpeg image/svg+xml;
    gzip_buffers 4 32k;
    gzip_vary on;
}

复制代码

14.防盗链

http 协议中,如果从一个网页跳到另一个网页,http 头字段里面会带个 Referer。图片服务器通过检测 Referer 是否来自规定域名,来进行防盗链。

语法: valid_referers none | blocked | server_names | string ...;
默认值: —
上下文: server, location

“Referer”请求头为指定值时,内嵌变量$invalid_referer被设置为空字符串,否则这个变量会被置成“1”。查找匹配 时不区分大小写,其中none表示缺少referer请求头、blocked表示请求头存在,但是它的值被防火墙或者代理服务 器删除、server_names表示referer请求头包含指定的虚拟主机名


配置如下
server {
    ...
    server_name  test.com;
    ...
    location ~ .*\.(gif|jpg|ico|png|css|svg|js) {
        valid_referers none blocked test.com 10.18.3.197;
        if ($invalid_referer) {
            return 404;
        }
        root static;
    }
    ...
}

复制代码

需要注意的是伪造一个有效的“Referer”请求头是相当容易的,因此这个模块的预期目的不在于彻底地阻止这些非法请求,而 是为了阻止由正常浏览器发出的大规模此类请求。还有一点需要注意,即使正常浏览器发送的合法请求,也可能没 有“Referer”请求头。

还有跟多的防盗链的配置和破解我在就不描述了,应为在对页面也就是前端来说,没有绝对的安全。
下面是关于nginx的防盗链的文章和防盗链的防御和破解。 www.cnblogs.com/limeng951/p…
www.cnblogs.com/saysmy/p/86…

这个里面讲了如何禁止使用F12查看源代码,以及右键查看元素
www.3lian.com/edu/2013/10…
但是这些都不能反正查看源代码,如果我用之前就打开F12模式在进入你的网站你如何防护呢?所以对于前端来说没有绝对的安全和保密。