10月26日 Nginx 2

1、启动压缩功能

ngx_http_gzip_module
用gzip方法压缩响应数据,节约带宽

1、gzip on | off;
启用或禁用gzip压缩
2、gzip_comp_level level;
压缩比由低到高:1 到9,默认:1
3、gzip_disable regex ...;
匹配到客户端浏览器不执行压缩
4、gzip_min_length length;
启用压缩功能的响应报文大小阈值,也就是响应报文达到多大后才启用压缩
5、gzip_http_version 1.0 | 1.1;
设定启用压缩功能时,协议的最小版本,默认:1.1
6、gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓存区的大小
默认:32 4k 或16 8k
7、gzip_types mime-type ...;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
默认包含有text/html,在配置文件中写类型的时候不用写上text/html,否则会出错
8、gzip_vary on | off;
如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding
9、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified| no_etag| auth| any ...;
nginx作为代理服务器,后端的真实服务器返回的响应报文首部含有什么时启用压缩功能
off:表示做为代理服务器时不启用压缩
expired,no-cache, no-store,private:对代理服务器请求的响应报文首部Cache-Control值任何一个,启用压缩功能
示例
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        access_log /var/log/nginx/nginx-com.log compression ;
        gzip on;
        gzip_comp_level 9;    
        gzip_min_length 128;   ---达到128个字节就压缩
        gzip_types text/css text/plain application/xml;

}
nginx -s reload
cp /var/log/messages-20170916 a.txt
chown nginx a.txt
在客户端测试
[root@centos6 network-scripts]#curl -I --compressed www.a.com/a.txt
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 26 Oct 2017 12:27:38 GMT
Content-Type: text/plain
Last-Modified: Thu, 26 Oct 2017 12:25:33 GMT
Connection: keep-alive
ETag: W/"59f1d43d-2523d9"
Content-Encoding: gzip   ---表示启用了压缩功能

2、实现https

ngx_http_ssl_module模块

1、ssl on | off;
为指定虚拟机启用HTTPS protocol,建议用listen指令代替
2、ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件
3、ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件
4、ssl_protocols[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl协议版本,默认为后三个
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存,提高缓存的命中率
6、ssl_session_timeout time;
客户端连接可以复用ssl_session_cache中缓存的ssl参数的有效时长,默认5m
示例
cd /etc/pki/tls/certs/  
make nginx.crt
openssl rsa -in nginx.key -out nginx.key   ---解密私钥的对称秘钥
vim /etc/nginx/conf.d/vhost.conf 
server {
        listen 443 ssl;   ---指定监听的端口和协议
        server_name www.a.com;
        root /app/website1;
        ssl on;   ---此项可以不加,因为前面已经指定了协议,就相当于已经开启了
        ssl_certificate /etc/pki/tls/certs/nginx.crt;  ---指明证书文件路径
        ssl_certificate_key /etc/pki/tls/certs/nginx.key;  ---指明私钥文件路径
        ssl_session_cache shared:sslcache:20m;  ---在各worker之间使用一个共享的缓存,缓存大小为20M
        ssl_session_timeout 10m;   ---客户端复用缓存的时间为10分钟,超过10分钟就不可以用这个缓存了
}
nginx支持一个物理服务器上创建多个https的虚拟主机。这一点比apache强大,apache只支持一个https虚拟主机

3、重定向

ngx_http_rewrite_module模块
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换

1、rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端
[flag]:
last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环,不建议在location中使用
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用,last和break客户端发起一次请求,服务器端帮你跳转,后面两个客户端相当于要发起两次请求
redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头,使用相对路径,状态码:302
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301
2、return
return code [text];
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码
3、rewrite_log on | off;
是否开启重写日志, 发送至error_log(notice level)
4、set $variable value;
用户自定义变量
注意:变量定义和调用都要以$开头
5、if (condition) { ... }
引入新的上下文,条件满足时,执行配置块中的配置指令;server, location
condition:
比较操作符:
== 相同
!= 不同
~:模式匹配,区分字符大小写
~*:模式匹配,不区分字符大小写
!~:模式不匹配,区分字符大小写
!~*:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件
-d, !-d 目录
-x, !-x 执行
示例
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        access_log /var/log/nginx/nginx-com.log compression ;
        gzip on;
        gzip_comp_level 9;
        gzip_min_length 128;
        gzip_types text/css text/plain application/xml;
        location / {
       rewrite ^/(.*)$ https://www.a.com/$1 redirect;    ---表示当访问http下的根时就临时重定向到https下的根 ^/(.*)$用于匹配输入的uri,如果匹配,就重定向到https根下,$1代表前面正则表达式匹配的内容
        }
        location /zz {
        rewrite ^/zz/(.*)$ /zhengzhou/$1 permanent;  ---表示当输入的uri匹配/zz/目录下的任何文件时就永久重定向到zhengzhou这个目录下的前面所匹配的文件
}
        location /admin {
        return 302 http://www.baidu.com/;   ---表示访问/admin目录时就跳转至百度
        return 403 'disallow';   ---表示当访问admin目录时就放回一个字符串disallow
}
}

4、从哪跳转(referer)

ngx_http_referer_module模块
用来阻止Referer首部无有效值的请求访问,可防止盗链

valid_referers none|blocked|server_names|string...;
定义referer首部的合法可用值,不能匹配的将是非法值
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式,表示本机
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.magedu\.com
示例1:实现跳转
准备两个虚拟主机,www.a.com和www.b.com
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        access_log /var/log/nginx/nginx-com.log compression ;
        gzip on;
        gzip_comp_level 9;
        gzip_min_length 128;
        gzip_types text/css text/plain application/xml; 
}
server{
        listen 80 ;
        server_name www.b.com;
        root /app/website2;
        access_log /var/log/nginx/nginx-2com.log compression ;
        gzip on;
        gzip_comp_level 9;
        gzip_min_length 128;
        gzip_types text/css text/plain application/xml;
}
vim a.html   ---a.html为www.a.com主目录下的文件
<a href=http://www.b.com> b.html </a>    ---表示当你访问http://www.a.com/a.html时会出现一个超链接b.html,鼠标点击这个超链接就会跳转至www.b.com
在www.b.com主目录下准备一个index.html文件,这样访问www.a.com时就会访问这个文件,实现跳转
在b上查看日志可以发现从www.a.com跳转过来的。
示例2:实现盗链
cd /app/website1
cp /usr/share/pixmaps/faces/sky.jpg a.jpg  ---在www.a.com网站的主目录下创建一个图片文件
cd /app/website2
vim b.html
<img src=http://www.a.com/a.jpg>    ---表示访问www.b.com/b.html时就会盗取www.a.com下的图片a.jpg
测试
http://www.b.com/b.html  ---发现成功盗取a网站的图片
示例3:如何实现防止盗链
[root@centos7 website2]#vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        access_log /var/log/nginx/nginx-com.log compression ;
        gzip on;
        gzip_comp_level 9;
        gzip_min_length 128;
        gzip_types text/css text/plain application/xml;
        valid_referers none block server_names *.a.com ~.*\.baidu\.com;   ---定义一个合法的跳转,也就是允许哪些主机跳转
        if ($invalid_referer){
                return 403 ;     ---表示如果是无效的跳转就被禁止,返回状态码403
}
测试
http://www.b.com/b.html  ---发现无法盗取www.a.com网站上的图片
查看www.a.com的日志文件,发现被禁止,出现403状态码

5、反向代理和缓存

ngx_http_proxy_module模块

  • proxy_pass URL;
    Context:location, if in location, limit_except
    注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location /images {
        proxy_pass http://172.18.21.106;   ---当不加/时表示当你访问/images目录时就反向代理至172.18.21.106/images目录,如果加上/表示反向代理制172.18.21.106根目录
}
}
在172.18.21.106上查看日志我们发现请求是来自反向代理服务器而不是真正的客户端,说明nginx做为反向代理服务器代替客户端去访问后面真正realserver上的资源,并将结果返回给客户端
  • 如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri,也就是不能加斜线; 用户请求时传递的uri将直接附加至后端服务器之后
    示例:实现访问html文件时调度到一台主机、访问jpg文件时调度到另外一台主机
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location ~ \.html$ {
        proxy_pass http://172.18.21.106;    ---表示当你访问的是.html结尾的文件时就调度到172.18.21.106目录下以.html结尾的文件
}
        location ~ \.(jpg|png|gif){
        proxy_pass http://172.18.21.7;  ---当你访问的是.jpg|png|gif结尾的文件时就调度到172.18.21.7目录下的响应文件
}
}
以上可以实现.html文件和图片文件的分别调度,要注意的是用正则表达式匹配时,不能加后面的斜线
  • proxy_set_header field value;
    设定发往后端realserver的请求报文的请求首部的值
    Context: http, server, location
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    请求报文的标准格式如下:
    X-Forwarded-For: client1, proxy1, proxy2
示例:实现经过Nginx反向代理后在后端的realserver上的日志中能个够查看到真正的客户端的地址
在nginx上服务器上的设置
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
       location ~ \.html$ {
        proxy_pass http://172.18.21.106;
}
        location ~ \.(jpg|png|gif)$ {
        proxy_pass http://172.18.21.7;
        proxy_set_header zhang-header $remote_addr;
}   ---$remote_addr是客户端的地址,如果用$proxy_add_x_forwarded_for也可以,这个变量表示如果Nginx反向代理服务器前面还有代理服务器,比如cdn代理,这个变量表示的是客户端和一个一个的代理服务器的地址,zhang-header可以任意写,是自己随便定义的一个首部
}
nginx -s reload
在后端httpd服务器上的操作
vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{zhang-header}i\" \"%{User-Agent}i\"" combined   ---在日志格式中定义调用这个请求首部
systemctl restart httpd
测试
访问http://www.a.com/b.jpg,在后端的httpd服务器上查看日志,可以看到客户端的地址
  • 缓存
1、 proxy_cache_path;
定义可用于proxy功能的缓存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
2、proxy_cache zone | off; 默认off
指明调用的缓存,或关闭缓存机制;Context:http, server, location
3、proxy_cache_keystring;
缓存中用于“键”的内容
默认值:proxy_cache_key$scheme$proxy_host$request_uri;
4、proxy_cache_valid[code ...] time;
定义对特定响应码的响应内容的缓存时长
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
5、proxy_cache_use_stale;
proxy_cache_use_stale error | timeout | invalid_header| updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...
在被代理的后端服务器出现哪种情况下,可以真接使用过期的缓存响应客户端
6、proxy_cache_methods GET | HEAD | POST ...;
对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
7、proxy_hide_header field;
默认nginx在响应报文不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel-等,用于隐藏后端服务器特定的响应首部
8、proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s,一般不建议超出75s,
9、proxy_send_timeout time;
将请求发送给后端服务器的超时时长;默认为60s
10、proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长,默认为60s
示例
1、vim /etc/nginx/nginx.conf
proxy_cache_path /var/lib/nginx/tmp/pcache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g;  ---注意只能定义在http,不能定义在server、location,keys_zone=proxycache:20m定义一个缓存空间的名字,也就是内存中的缓存空间,大小是20M, max_size=1g表示保存到磁盘上的最大空间是1g
    tcp_nodelay         on;
2、vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location ~ \.html$ {
        proxy_pass http://172.18.21.106;
        proxy_cache proxycache;  ---调用前面定义的缓存空间
        proxy_cache_key $request_uri;     
        proxy_cache_valid 200 301 302 1h;   ---定义每种状态码缓存的时间
        proxy_cache_valid any 1m;
}
}
nginx -s reload
3、访问、测试
http://www.a.com/a.html   ---访问之后就会有缓存
ab -c 1000 -n 10000 172.18.21.107/a.html  ---测试,和之前的对比,发现缓存之后速度提升很多
[root@centos7 pcache]#tree
.
├── 5
│   └── bd
│       └── 00
│           └── b7337bb1b8a2bfd56bccb9cecb200bd5
└── b
    ├── 2d
    │   └── 78
    │       └── 65827078a9f7ccce59632263294782db
    └── 82
        └── a4
            └── d1546d731a9f30cc80127d57142a482b
levels=1:2:2  定义缓存的目录结构,用于存储客户端访问的资源和文件,先是对缓存的文件进行哈希值运算,运算后是一个16进制的数字,每个16进制代表4位二进制,如果用md5算法进行哈希值运算,得出来是128位,1:2:2代表用哈希运算后的从后至前1位16进制数字表示1级目录的名字,2位16进制数字代表二级目录的名字,2位16进制代表三级目录的名字

每一级目录的个数如下图


Paste_Image.png
  • ngx_http_headers_module模块
    向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值,用于向客户端发送的响应报文中,添加代理服务器的首部信息
1、add_header name value [always];
添加自定义首部
add_header X-Via $server_addr;   ---添加代理服务的地址
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;    ---添加代理服务的FQDN名字
2、add_trailer name value [always];
添加自定义响应信息的尾部

6、Nginx反向代理至php和缓存

ngx_http_fastcgi_module
转发客户端的请求到FastCGI服务器,不支持php模块方式

Paste_Image.png
1、fastcgi_pass address;
address为后端的fastcg iserver的地址,可用位置:location, if in location
2、fastcgi_index name;
fastcgi默认的主页资源
示例:fastcgi_index index.php;
3、fastcgi_param parameter value [if_not_empty];
设置传递给FastCGI服务器的参数值,可以是文本,变量或组合

示例:实现当客户端访问的是php程序的时候就反向代理至后端的php服务器

1、在php服务器上安装php-fpm
yum install php-fpm
vim /etc/php-fpm.d/www.conf 
listen = 9000
;listen.allowed_clients = 127.0.0.1  ---把这一行用分号注释掉,默认允许任何主机访问
pm.status_path = /status  ---打开下面这两项就可以查看php的运行状态
ping.path = /ping
service php-fpm start
mkdir /app/php   ---创建一个存放php程序的根目录
vim a.php 
vim a.php 
<?php
phpinfo();
?>
2、在nginx服务器上的配置
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location ~* \.php$ {     ---当匹配的uri是以.php结尾的文件时就反向代理至后端的php服务器
                fastcgi_pass 172.18.21.106:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;  ---指明后端存放php程序的目录,$fastcgi_script_name匹配的是你访问的uri中.php文件
                include fastcgi_params;   ---此文件在/etc/nginx/目录下
}
        location ~* ^/(status|ping)$ {          ---当匹配的cui是status或者ping时就反向代理至后端的php服务器,可以查看php服务器的运行状态
                fastcgi_pass 172.18.21.106:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
                include fastcgi_params;
}
}
nginx -s reload
3、测试
http://www.a.com/a.php    ---可以发现连接php成功
http://www.a.com/status    ---可以查看php运行状态
http://www.a.com/ping      ---当后端的php是活着的时候会出现pong字样,表示是活着的
  • 实现fastcgi缓存
1、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
定义fastcgi的缓存;
path 缓存位置为磁盘上的文件系统
max_size=size:磁盘path路径中用于缓存数据的缓存空间上限
levels=levels:缓存目录的层级数量,以及每一级的目录数量,levels=ONE:TWO:THREE,示例:leves=1:2:2
keys_zone=name:size:k/v映射的内存空间的名称及大小,也就是在内存中定义一个缓存空间的名称和大小
inactive=time非活动时长
2、fastcgi_cache zone | off;
调用指定的缓存空间来缓存数据
可用位置:http, server, location
3、fastcgi_cache_key string;
定义用作缓存项的key的字符串
示例:fastcgi_cache_key $request_rui;
4、fastcgi_cache_methods GET | HEAD | POST ...;
为哪些请求方法使用缓存
5、fastcgi_cache_min_uses number;
缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项
6、fastcgi_keep_conn on | off;
收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接
7、fastcgi_cache_valid[code ...] time;
不同的响应码各自的缓存时长
示例
1、vim /etc/nginx/nginx.conf
fastcgi_cache_path /var/lib/nginx/tmp/fastcgicache levels=1:2:2 keys_zone=fastcgicac
he:20m inactive=120s max_size=1g;    ---只能放在http位置,不能放在server和location
2、vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location ~* \.php$ {
                fastcgi_pass 172.18.21.106:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_cache fastcgicache;    ---调用上面定义的缓存空间
                fastcgi_cache_key $request_uri;
                fastcgi_cache_valid 200 301 302 1h;   ---定义每种响应码缓存的时间
                fastcgi_cache_valid any 1m;

}
3、测试
http://www.a.com/index.php   ---在浏览器访问后会有缓存
ab -c 100 -n 1000 172.18.21.107/a.php    ---发现比原来的快了很多

7、upstream实现将用户的请求反向调度至后端的多个realserver,实现平衡负载

ngx_http_upstream_module模块
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用

1、upstream name { ... }
定义后端服务器组,会引入一个新的上下文
默认调度算法是wrr
Context: http
upstream httpdsrvs{
server ...
server...
...
}
2、server address [parameters];
在upstream上下文中server成员,以及相关的参数;Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number 权重,默认为1
max_conns连接后端报务器最大并发活动连接数,1.11.5后支持
max_fails=number失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1
fail_timeout=time 后端服务器标记为不可用状态的连接超时时长,默认10s
backup将服务器标记为“备用”,即所有服务器均不可用时才启用
down标记为“不可用”,配合ip_hash使用,实现灰度发布,也就是让服务器一部分一部分的上线
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调度到同一个realserver
hash $remote_addr;
6、keepalive连接数N;
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗
示例
vim /etc/nginx/nginx.conf
  upstream webserver {      ---只能定义在http处
                server 172.18.21.106:80 weight=2;
                server 172.18.21.7:80;
        }
vim /etc/nginx/conf.d/vhost.conf 
server{
        listen 80 default_server;
        server_name www.a.com;
        root /app/website1;
        location  / {
        proxy_pass http://webserver;     ---当访问根时就会根据算法调度到后面的realserver上
}
}
测试
http://www.a.com/

8、实现基于tcp或udp的反向调度

ngx_stream_core_module模块
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器
ngx_stream_proxy_module模块
可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流
1 proxy_pass address;
指定后端服务器地址
2 proxy_timeout timeout;
无数据传输时,保持连接状态的超时时长,默认为10m
3 proxy_connect_timeout time;
设置nginx与被代理的服务器尝试建立连接的超时时长
默认为60s
示例:实现nginx反向代理mysql数据库服务

1、在后端两个mysql数据库服务器上的操作
yum install mysql-server
service mysqld start
chkconfig mysqld on
mysql
create user test@'172.18.21.107' identified by 'centos';   ---在两台mysql服务器上都要创建一个用户能够远程连接mysql数据,在这里设定的是172.18.21.107这台主机的test用户可以连接,默认root用户是不能远程连接的。
2、在nginx服务器上的操作
vim /etc/nginx/nginx.conf   ---注意要把这个语句块放到http上面,和http语句块是平级的关系
stream{
        upstream mysqlsrvs{
                server 172.18.21.6:3306;
                server 172.18.21.7:3306;  ---两台rs的地址和端口
                least_conn;  ---指明调度算法为最小连接
}
        server{
                listen 172.18.21.107:3306;
                proxy_pass mysqlsrvs;
                proxy_timeout 60s;    ---无数据传输时保持连接状态的超时时长
                proxy_connect_timeout 10s;   ----nginx与后端rs尝试建立连接的超时时长
}
}
nginx   ----启动服务
3、在客户端测试
mysql -utest -p'centos' -h'172.18.21.107'   ---输入两次,发现每次连接的数据库不同,说明nginx反向调度成功

9、源码编译安装nginx

1、安装开发包组和响应的软件包、创建账号
yum groupinstall "development tools"
yum install pcre-devel openssl-devel zlib-devel
useradd -r nginx -s /sbin/nologin    ---创建一个nginx账号
cd /app
tar xvf nginx-1.12.2.tar.gz 
2、更改源码信息,将版本信息更改
vim /app/nginx-1.12.2/src/http/ngx_http_header_filter_module.c 
static u_char ngx_http_server_string[] = "Server: zhanginx" CRLF;   ---表示关闭server_tokens off时显示的版本信息
vim /app/nginx-1.12.2/src/core/nginx.h 
#define NGINX_VERSION      "6.66.666."
#define NGINX_VER          "tengine/" NGINX_VERSION
3、执行configure脚本,并安装
./configure --prefix=/usr/local/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
make -j 4 && make install
4、修改PATH变量
 vim /etc/profile.d/nginx.sh
PATH=/usr/local/sbin/:$PATH
. /etc/profile.d/nginx.sh
echo $PATH
5、修改配置文件,并启动服务
vim /etc/nginx/nginx.conf
user  nginx;  ---将user改为nginx,否则启动不了服务
nginx  ---启动服务
6、测试
[root@centos6 php.d]#curl -I 172.18.21.7
HTTP/1.1 200 OK
Server: tengine/6.66.666.    ---发现版本信息已经修改
Date: Sat, 28 Oct 2017 13:24:34 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 28 Oct 2017 13:10:09 GMT
Connection: keep-alive
ETag: "59f481b1-264"
Accept-Ranges: bytes
7、修改配置文件
vim /etc/nginx/nginx.conf
server_tokens off;   ---在http语句块中加上这条内容
nginx -s reload
8、测试
[root@centos6 php.d]#curl -I 172.18.21.7
HTTP/1.1 200 OK
Server: zhanginx   ---发现版本号是我们自己定义的了
Date: Sat, 28 Oct 2017 13:26:48 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 28 Oct 2017 13:10:09 GMT
Connection: keep-alive
ETag: "59f481b1-264"
Accept-Ranges: bytes
备注:
编译安装nginx选项:
--prefix=/etc/nginx 安装路径
--sbin-path=/usr/sbin/nginx 指明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 指明pid文件安装位置
--lock-path=/var/run/nginx.lock 锁文件安装位置
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp作为代理服务器,服务器响应报文的临时文件存放路径
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp作为fastcgi代理服务器,服务器响应报文的临时文件存放路径
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp作为uwsgi代理服务器,服务器响应报文的临时文件存放路径
--http-scgi-temp-path=/var/cache/nginx/scgi_temp作为scgi反代服务器,服务器响应报文的临时文件存放路径
--user=nginx指明以那个身份运行worker进程,主控master进程一般由root运行
--group=nginx
--with-http_ssl_module表示把指定模块编译进来
客户端body部分的临时文件存放路径,如果服务器允许客户端使用put方法提交大数据时,临时存放的磁盘路径
[root@centos7 ~]#nginx -V   ---使用此条命令在用yum安装的nginx服务器上可以看到yum编译安装时候的各个选项的设置
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,636评论 24 1,002
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,858评论 0 3
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,920评论 21 356
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 889评论 0 4
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,985评论 0 9