NGINX2

nginx的地址重定向,代理,调度(调度算法),和源码编译;

nginx的源码编译:

1 . 下载源码包:http://nginx.org/en/download.html

2 .构建配置环境:(安装编译所需要的包)

yum groupinstall “development tools”

yum install pcre-devel openssl-devel zlib-devel

mkdir /app   (新建文件夹供nginx的安装时用)

useradd -r nginx(创建nginx用户账号)

3 .将下载的源码上传到Linux系统里:并解压缩。

tar -xvf nginx-1.12.2.tar.gz

cd nginx-1.12.2   (进入到解压后的文件夹里)

4. 修改nginx的源码参数:(可以不用修改,此处仅为了更改nginx的服务名而已)

cd   /root/nginx-1.12.2/src/http

vim ngx_http_header_filter_module.c

QQ截图20180706200440

cd   /root/nginx-1.12.2/src

vim nginx.h

QQ截图20180706200440

 

5.开始编译:

cd /root/nginx-1.12.2

./configure –prefix=/app/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.pid \         (指定运行程序的路径)
–lock-path=/var/run/nginx.lock \
–user=nginx –group=nginx \                (指定用户)
–with-http_ssl_module \                        (以下都是指定要编译的模块)
–with-http_v2_module \
–with-http_dav_module \
–with-http_stub_status_module \
–with-threads –with-file-aio

QQ截图20180706201742

6 . make -j 4 && make install

7 . 将nginx的运行程序的路径添加到PATH变量  /app/nginx/sbin

8 ./app/nginx/html  (编译安装后的主页面路径)

9.  curl -I 192.168.60.20(在另一台客户端访问可以发现主机头部的服务名称已经改变了)

QQ截图20180706205046

总结:如果需要添加加自己的配置文件例如:/etc/nginx/conf.d/*.conf

则需要将此路径添加到主配置文件里:include   /etc/nginx/conf.d/*.conf;具体添加到何处可以参考yum安装的生成的主配置文件里的写法。

 

ngx_http_rewrite_module (地址重定向模块)

last:重写完成后停止对当前URI在当前location中后续的其它重写操作, 而后对新的URI启动新一轮重写检查;提前重启新一轮循环,不建议在location中 使用

break:重写完成后停止对当前URI在当前location中后续的其它重写操作, 而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使 用 

redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成 的新URI给客户端,由客户端重新发起请求;使用相对路径,或者http://或https:// 开头,状态码:302

permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给 客户端,由客户端重新发起请求,状态码:301

注意:

如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个 检查;被某条件规则替换完成后,会重新一轮的替换检查

隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示 的标志位用于控制此循环机制

如果replacement是以http://或https://开头,则替换结果会直接以重向返 回给客户端, 即永久重定向301

示例1:

location /bbs  {
             rewrite ^/bbs/(.*)$       /forum/$1     break;     ($1就是(.*)里的内容)

上条的意思就是:当用户访问根目录下的/bbs/下的(.*)内容时就会跳转到/forum/下的(.*)的内容

bbs和forum都在同一个目录下既在定义的root   /data/test1/(主页面目录下)

测试:在 /data/test1/下新建两个文件夹并写入内容:

mkdir bbs forum

echo bbs > bbs/index.html
echo forum > forum/index.html

QQ截图20180707113148

此时访问:www.a.com/bbs/    (应该是显示forum目录下的内容;bbs目录下可以没有任何内容,此目录也可以不存在,他只是url路径而已并且被重定向到forum目录下的内容了)

示例2:(当访问一个网站是不加密的时候跳转到加密的网站;背后是有两个虚拟主机网站的)要实现加密还需要去申请和颁发证书文件才行。

location /   {
rewrite /   https://www.a.com/   redirect; (当访问源网站的根时 就跳转到新的https的网站的根上去;采用临时跳转)

示例3:(当访问一个网站是不加密的时候跳转到加密的网站;背后只有一个虚拟主机网站)

 

QQ截图20180707141150

示例4:(实现动静态页面的分离)

当访问静态页面时(如,图片.文档)则跳转到一个路径下;当访问动态资源时(如;php程序)则跳转到另一个路径下:

QQ截图20180707143019

例如在;/data/test1/下新建一个pp.html的文件

curl  www.a.com/pp.txt   (就会显示pp.html文件里的内容)因为上面定义了只要访问(.*).txt 就会跳转到$1.html的文件里  其中$1=(.*)

ngx_http_referer_module  (防盗链模块)

QQ截图20180707151814

QQ截图20180707152128

如果不是从这几个地方访问的就给与拒绝;返回403;

 

nginx的代理

实验1;实现简单的代理转发:

新建位图图像

1. 在后端的web服务器上安装http服务并开启服务。

2 .在nginx代理服务器上;

首先安装nginx服务;然后修改配置文件在单个的自配置文件里

/etc/nginx/conf.d/test1.conf

QQ截图20180707160417

在客户端直接curl 172.20.49.2(此地址为nginx服务器的桥接网卡的地址)就会转到后台的http服务器上。

在上述实验的基础上实现:对特定url的名称的跳转:

QQ截图20180707170639

 

上述配置文件:当访问nginx代理服务器的具体路径时,会转发到后台服务器的/forum/下的文件夹

需要在后台服务器的主页面下新建一个/var/www/html/forum/index.html文件,

http://172.20.49.2/bbs/   (在浏览器上访问)

curl -L 172.20.49.2/bbs/   (使用curl来访问)

如果将后端服务器的端口号改成8080的情况下

只需要修改代理服务器的端口就可以了。如下图配置:

QQ截图20180707171502

 

上述实验是只要访问服务器的IP地址就都代理走,现在要实现只针对/bbs才转发到后台的服务器上;配置如下:

QQ截图20180707172445

当上图的设置并不是在访问nginx的IP地址curl -L 172.20.49.2/bbs/时就会将其转到192.168.60.4后端服务器的主页面上,而是将其转到后端服务器主页面上的/var/www/html/bbs目录下的。

如果要转到后台服务器的根下,则如下面的配置:(IP地址后面多了个/号)

QQ截图20180707173134

总结:如果后台服务器的IP地址最后不添加/号,则是代理到后台服务器相同的文件目录下(置换url路径)

如果添加/号则代理到后台服务器的主页面下

 

 

实验2 :实现静态和动态页面转发到后台不同的服务器上。

新建位图图像

1 . 在nginx代理服务器上进行设置:

yum install nginx (安装nginx服务)

vim /etc/nginx/conf.d/test1.conf (创建配置文件)

QQ截图20180707200146

nginx -s reload  (重新加载配置文件)

nginx    (开启服务)

http://172.20.49.2/index.html   (在浏览器上访问静态页面,就会被调度到静态web服务器上去了)

http://172.20.49.2/test.php        (在浏览器上访问动态界面,就会被调度到动态web服务器上去了)

 

2 . 在http-php动态主机服务器上:

yum install php-fpm php-mysql   (安装php包和连接数据库的包)

systemctl start php-fpm   (启动php-fpm服务)由于是和http服务器在同一台机器上,所以php-fpm的配置文件不需要更改。

yum install httpd (安装HTTP服务)

vim /etc/httpd/conf.d/php.conf(创建配置文件让php的程序能够在http下运行)

DirectoryIndex index.php ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

创建连接数据库的测试代码:
vim /var/www/html/test.php

<?php
$dsn=’mysql:host=192.168.60.22;dbname=test’;
$username=’test’;
$passwd=’centos’;
$dbh=new
PDO($dsn,$username,$passwd);
var_dump($dbh);
?>

systemctl start httpd   (启动http服务)

3 . 在静态的web服务器上进行设置:

yum install httpd (安装HTTP服务)

echo stainpage > /var/www/html/index.html  (建立静态服务器的主页面)

systemctl restart httpd   (重启服务)

4 . 在数据库的服务器主机上:

yum install mariadb-server   (安装数据库服务)

grant all on *.* to test@’192.168.60.%’ identified by ‘centos’; (在数据库中创建连接前端web服务器的用户账号)

 

上述实验中在后端服务器上的日志里记录的是nginx服务器访问的地址无法看到真实的客户端访问的IP地址。

解决办法;在数据报文头部添加新的字段。(在nginx代理服务器的配置文件里添加一行命令)

server {
listen 80 default_server;
server_name www.a.com;
root /data/test1/;
location ~ \.php$ {
proxy_pass http://192.168.60.21;
}
location / {
proxy_set_header remoyeclient $remote_addr; (在此添加此行命令,在192.168.60.20的日志里就会)
proxy_pass http://192.168.60.20;                               (看到来自客户端访问的IP地址了;加在此处只对)
}                                                                                           (60.20的静态web服务器有效,如果想要动态的web)

}                                                                                               (服务器也可以看到客户端的IP地址在上面也添加)

remoyeclient (此字段可以由自己随便定义)

还需要在后台静态的web服务器上修改http的日志格式;

vim /etc/httpd/conf/httpd.conf

QQ截图20180707212252

最后再次查看静态web服务器的http日志就能发现客户端访问的IP地址了。

 

 

实验将nginx代理服务器的缓存共能开启;

新建位图图像

 

当客户端访问后端web服务器数据时,nginx代理服务器如果启用缓存,则直接将数据提供给客户端,提高了 访问的速度。(速度一般会快到2倍左右)

1 . 首先新建nginx的缓存目录:

mkdir /var/cache/nginx

2 .修改配置文件;(此选项要添加在nginx的主配置文件里的http的语句块里)

proxy_cache_path path /var/cache/nginx/proxy_cache levels=1:1:1

keys_zone=proxycache:20m

inactive=120s  max_size=1g;

说明:(levels=1:1:1 缓存的三级文件夹;/var/cache/nginx/缓存存放的路径)

proxycache:20m 指内存中缓存的大小,主要用于存放key和metadata (如:使用次数和url名称)(对应文件的名称哈希值算法的键值对)max_size=1g 指磁盘存入文件内容的缓存空间最大值

 

QQ截图20180708153106

3 . 调用缓存功能,需要定义在相应的配置段,如server{…}; 在虚拟主机的配置文件里添加

proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;

QQ截图20180708153323

此时在客户端再次访问就会在:/var/cache/nginx/文件夹下生成缓存文件:每个缓存文件为三级目录结构。

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off … 在被代理的后端服务器出现哪种情况下,可以真接使用过期的缓存响应客户 端 

10、proxy_connect_timeout time;

定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为 60s,一般不建议超出75s

11、proxy_send_timeout time;

将请求发送给后端服务器的超时时长;默认为60s

12、proxy_read_timeout time;

等待后端服务器发送响应报文的超时时长,默认为60s

 

 

 

ngx_http_fastcgi_module

转发请求到FastCGI服务器,不支持php模块方式

1、fastcgi_pass address;

address为后端的fastcgi server的地址

可用位置:location, if in location

2、fastcgi_index name;

fastcgi默认的主页资源 示例:

fastcgi_index index.php;

3、fastcgi_param parameter value [if_not_empty];

设置传递给 FastCGI服务器的参数值,可以是文本,变量或组合

 

实验:基于fastcgi实现nginx的lnmp服务

结构拓扑图:

新建位图图像

1 . 在ngix服务器上:

yum install nginx  (安装nginx服务)

vim /etc/nginx/conf.d/test1.conf    (修改虚拟主机的配置文件)

fastcgi_pass 192.168.60.21:9000;       (指定php服务器的的IP地址和端口号)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name; (指定php程序存放的路径;目录在)
include fastcgi_params;                                                                                    (php服务器上已经创建好了)

QQ截图20180708170210

重新启动nginx服务就可以了

2 . 在php服务器上:

yum install php-fpm php-mysql (安装php包和连接数据库的包)
systemctl start php-fpm (启动php-fpm服务)由于是和http服务器在同一台机器上,所以php-fpm的配置文件不需要更改。

vim /etc/php-fpm.d/www.conf(修改php-fpm的配置文件将监听端口监听到nginx服务器上去。)

QQ截图20180708163438

systemctl restart php-fpm (重新启动php服务)

mkdir /data/php -p  (新建目录来存放php程序的主页面)

创建连接数据库的测试代码:
vim /data/php/test.php
<?php
$dsn=’mysql:host=192.168.60.22;dbname=test’;
$username=’test’;
$passwd=’centos’;
$dbh=new
PDO($dsn,$username,$passwd);
var_dump($dbh);
?>

3 . 在数据库的机器上:

yum install mariadb-server (安装数据库服务)
grant all on *.* to test@’192.168.60.%’ identified by ‘centos’; (在数据库中创建连接前端web服务器的用户账号)

4 . 在客户端访问:http://172.20.20.2/test.php  就可以了

 

小记:在fscgi上也可以实现缓存,来提高访问速度,具体在43天的视频里。

 

 

 

ngx_http_upstream_module(调度算法模块)

nginx作为转发服务器可以自动的检测后台服务器的健康状态,如果后台的web服务器宕机了,nginx就不会再转发到后台宕机的服务器上去了。

1    默认调度算法是rr ,如果没添加权重的话;

2  如果在后面加上权重的话就变成wrr算法。

3、ip_hash

源地址hash调度方法

4、least_conn

最少连接调度算法,当server拥有不同的权重时其为wlc, 当所有后端主机连接数相同时,则使用wrr,适用于长连接

5、hash key [consistent]

基于指定的key的hash表来实现对请求的调度, 此处的key可以直接文本、变量或二者组合

作用:将请求分类,同一类请求将发往同一个upstream server,使用 consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器 (如varnish)时使用

hash $request_uri consistent;   (只要访问某一个固uri路径就向固定的一个地方来调度;如访问www.a.com /test1.html 不论你来自于哪个用户只要访问此test1.html就向某个固定的服务器上调度

此种方法的好处是配合后台的缓存服务器来使用;后台的缓存服务器“varnish”存在于调度器和web服务其之间来缓存用户的访问后台web服务器上的数据;如果缓存上有就无需再向后台web服务器上去调用,大大的提高了访问的速度。如下图所示:

新建位图图像

当客户端只要访问1.html的url时就调度到第一个缓存服务器上,之后再调度到后端的web服务器上,再第二此访问时,缓存服务器上就有了数据,无需从web上再次读取,直接从缓存服务器上调取数据,大大提高了访问的速度。(任意用户只要访问1.html都会向第一个缓存服务器上调度)

 

 

hash $remote_addr;

(其中一致性的哈希算法:)服务器中有一个哈希环,大小为2^32大小,然后对每个后台web服务器的IP地址做哈希值计算然后取模,取模后的数字代表此后端服务器,每个后端服务器取模后的值放在哈希环上,客户端访问时,也将客户端的IP地址哈希取模,然后将其放在哈希环上,顺时针访问离自己最近的web服务器的主机。(当后端主机数量较少时。可能会使后端服务器都处于哈希环的一侧,导致哈希环偏离,这时系统会自动的将原来的后端服务器的IP地址按权重,乘以100,将每个web的服务器都放大到100倍的数量,在做哈希值的运算将其放到哈希环上就不会导致哈希环的偏离了)

 

 

实验:实现使用nginx来实现前台的调度:

实验结构拓扑图:

新建位图图像

1 . 在nginx调度服务器上:

yum install nginx  (安装包)

nginx  (启动服务)

vim /etc/nginx/nginx.conf  (修改主配置文件)

upstream www {
server 192.168.60.21;
server 192.168.60.20;

}

QQ截图20180708181425

vim /etc/nginx/conf.d/test1.conf

location / {
proxy_pass http://www; (当访问本机的根时,给他转发到www上去www来自前面主配置文件里定义的)

QQ截图20180708181001

2. 在后端的两台web服务器上:

RS1:

安装http服务:

yum install httpd  (安装包)

echo RS1 > /var/www/html/index.html   (创建主页面)

systemctl start httpd (启动服务)

RS2:
安装http服务:
yum install httpd (安装包)
echo RS2 > /var/www/html/index.html (创建主页面)
systemctl start httpd (启动服务)

3 . 在客户端访问:curl www.a.com  / curl 172.20.20.22(就可以实现后台两台web服务器的调度了)

小结:nginx作为转发的服务器,能够实现健康性检查,当后台的服务器宕机了,就不会调度到宕机的服务器上去了,如果恢复了,就会自动的添加到调度表里去。

 

当端口号不同时也能实现调度任务。

将后台的一台web服务器的端口号改为8080;

然后需要修改;主配置文件也做相应的端口号更改。

upstream www {
server 192.168.60.21:8800;    (添加8800就可以了,不写的话默认使用的是80端口号)
server 192.168.60.20;

其他的功能介绍:

server 192.168.60.4 weight=2;   (加权重2;不写权重默认为1)

server 192.168.60.4   max_conns  10000;   (连接后端报务器最大并发活动连接数,1.11.5版本后支持 )

server 192.168.60.4 max_fails=3;   (失败尝试最大次数;超出此处指定的次数时,server将被标 记为不可用,默认为1 )

server 192.168.60.4 fail_timeout=20s;   (后端服务器标记为不可用状态的连接超时时长,默认10s )

server 192.168.60.4 backup;         (将服务器标记为“备用”,即所有服务器均不可用时才启用 )

server 192.168.60.4  down;            (标记为“不可用”,配合ip_hash使用,实现灰度发布 )

调度算法的更改:(添加到下面的位置)

QQ截图20180708194447

ip_hash         源地址hash调度方法

least_conn     最少连接调度算法(上文有详细的解释)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/102344

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code