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
cd /root/nginx-1.12.2/src
vim nginx.h
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
6 . make -j 4 && make install
7 . 将nginx的运行程序的路径添加到PATH变量 /app/nginx/sbin
8 ./app/nginx/html (编译安装后的主页面路径)
9. curl -I 192.168.60.20(在另一台客户端访问可以发现主机头部的服务名称已经改变了)
总结:如果需要添加加自己的配置文件例如:/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
此时访问:www.a.com/bbs/ (应该是显示forum目录下的内容;bbs目录下可以没有任何内容,此目录也可以不存在,他只是url路径而已并且被重定向到forum目录下的内容了)
示例2:(当访问一个网站是不加密的时候跳转到加密的网站;背后是有两个虚拟主机网站的)要实现加密还需要去申请和颁发证书文件才行。
location / {
rewrite / https://www.a.com/ redirect; (当访问源网站的根时 就跳转到新的https的网站的根上去;采用临时跳转)
示例3:(当访问一个网站是不加密的时候跳转到加密的网站;背后只有一个虚拟主机网站)
示例4:(实现动静态页面的分离)
当访问静态页面时(如,图片.文档)则跳转到一个路径下;当访问动态资源时(如;php程序)则跳转到另一个路径下:
例如在;/data/test1/下新建一个pp.html的文件
curl www.a.com/pp.txt (就会显示pp.html文件里的内容)因为上面定义了只要访问(.*).txt 就会跳转到$1.html的文件里 其中$1=(.*)
ngx_http_referer_module (防盗链模块)
如果不是从这几个地方访问的就给与拒绝;返回403;
nginx的代理
实验1;实现简单的代理转发:
1. 在后端的web服务器上安装http服务并开启服务。
2 .在nginx代理服务器上;
首先安装nginx服务;然后修改配置文件在单个的自配置文件里
/etc/nginx/conf.d/test1.conf
在客户端直接curl 172.20.49.2(此地址为nginx服务器的桥接网卡的地址)就会转到后台的http服务器上。
在上述实验的基础上实现:对特定url的名称的跳转:
上述配置文件:当访问nginx代理服务器的具体路径时,会转发到后台服务器的/forum/下的文件夹
需要在后台服务器的主页面下新建一个/var/www/html/forum/index.html文件,
http://172.20.49.2/bbs/ (在浏览器上访问)
curl -L 172.20.49.2/bbs/ (使用curl来访问)
如果将后端服务器的端口号改成8080的情况下
只需要修改代理服务器的端口就可以了。如下图配置:
上述实验是只要访问服务器的IP地址就都代理走,现在要实现只针对/bbs才转发到后台的服务器上;配置如下:
当上图的设置并不是在访问nginx的IP地址curl -L 172.20.49.2/bbs/时就会将其转到192.168.60.4后端服务器的主页面上,而是将其转到后端服务器主页面上的/var/www/html/bbs目录下的。
如果要转到后台服务器的根下,则如下面的配置:(IP地址后面多了个/号)
总结:如果后台服务器的IP地址最后不添加/号,则是代理到后台服务器相同的文件目录下(置换url路径)
如果添加/号则代理到后台服务器的主页面下
实验2 :实现静态和动态页面转发到后台不同的服务器上。
1 . 在nginx代理服务器上进行设置:
yum install nginx (安装nginx服务)
vim /etc/nginx/conf.d/test1.conf (创建配置文件)
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
最后再次查看静态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 指磁盘存入文件内容的缓存空间最大值
3 . 调用缓存功能,需要定义在相应的配置段,如server{…}; 在虚拟主机的配置文件里添加
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
此时在客户端再次访问就会在:/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服务器上已经创建好了)
重新启动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服务器上去。)
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;
}
vim /etc/nginx/conf.d/test1.conf
location / {
proxy_pass http://www; (当访问本机的根时,给他转发到www上去www来自前面主配置文件里定义的)
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使用,实现灰度发布 )
调度算法的更改:(添加到下面的位置)
ip_hash 源地址hash调度方法
least_conn 最少连接调度算法(上文有详细的解释)
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/102344