b2c信息网

您现在的位置是:首页 > 前天新闻 > 正文

前天新闻

进入nginx源码目录(nginx基于url子目录)

hacker2022-06-14 22:38:20前天新闻58
本文目录一览:1、集群和负载均衡的区别nginx

本文目录一览:

集群和负载均衡的区别 nginx

Nginx是一个免费的,开源的,高性能的服务器和反向代理服务器软件,同时它也可以为IMAP和POP3服务器代理,以其高性能,稳定性,丰富的功能,结构简单,低资源消耗的特性换来广大运维者所喜爱。

Nginx与传统的服务器不同,不依赖线程来处理请求。相反,它使用一个更可扩展事件驱动架构(异步)。这种结构资源消耗较小,但更重要的是,可以承受较大的请求负荷。即使你不希望处理成千上万的请求,你仍然可以受益于Nginx的高性能和小的内存占用,以及其丰富的功能。

Nginx的反向代理:

反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于LVS-NET模型。

反向代理也可以理解为web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的 一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。因此Nginx还具有缓存功能。

反向代理的工作流程:

1)用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址;

2)反向代理服务器接收用户的请求;

3)反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;

4)如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。

反向代理的好处:

1)解决了网站服务器对外可见的问题,提高了网站服务器的安全性;

2)节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;

3)加速了网站的访问速度,减轻了真是web服务器的负荷。

(一)、调度算法

Nginx的upstream指令用于指定proxy_pass和fastcgi_pass所使用的后端服务器,即nginx的反向代理功能,因此可以将两者结合起来使用以达到负载均衡的目的,而Nginx也支持多种调度算法:

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。

2、weight

指定在轮询的基础上加上权重,weight和访问比率成正比,即用于表明后端服务器的性能好坏,若后端服务器性能较好则可将大部分请求分配给它,已实现其力所能及。

例如:

我后端服务器172.23.136.148配置:E5520*2 CPU,8G内存

后端服务器172.23.136.148配置:Xeon(TM)2.80GHz * 2,4G内存

我希望在有30个请求到达前端时,其中20个请求交给172.23.136.148处理,剩余10个请求交给172.23.136.149处理,就可做如下配置

upstream web_poll {

server 172.23.136.148 weight=10;

server 172.23.136.149 weight=5;

}

3、ip_hash

每个请求按访问ip的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法进行哈希出一个值,在随后的请求客户端IP的哈希值只要相同,就会被分配至同一个后端服务器,该调度算法可以解决session的问题,但有时会导致分配不均即无法保证负载均衡。

例如:

upstream web_pool {

ip_hash;

server 172.23.136.148:80;

server 172.23.136.149:80;

}

4、fair(第三方)

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

upstream web_pool {

server 172.23.136.148;

server 172.23.136.149;

fair;

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream web_pool {

server squid1:3128;

server squid2:3128;

hash $request_uri;

hash_method crc32;

}

每个设备的状态设置为:

1.down 表示当前的server不参与负载,用于ip_hash中

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails 允许请求失败的次数默认为1.设为0则表示关闭该项功能,当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout 在max_fails定义的失败次数后,暂停的时间。

5.backup 可以将其理解为备机,其它所有的非backup机器down或者忙的时候,才会将请求分配给backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

(二)、指令的使用

1、upstream

声明一组可以被proxy_pass和fastcgi_pass引用的服务器;这些服务器可以使用不同的端口,并且也可以使用Unix Socket;也可以为服务器指定不同的权重。如:

upstream web_pool {

server coolinuz.9966.org weight=5;

server 172.23.136.148:8080 max_fails=3 fail_timeout=30s;

server unix:/tmp/backend3;

}

2、server

语法:server name [parameters]

其中的name可以是FQDN,主机地址,端口或unix套接字;如果FQDN解析的结果为多个地址,则每个地址都会被用到。

3、proxy_pass

语法:proxy_pass URL;

该指令用于指定代理服务器的地址和URL将被映射为的URL或地址和端口。即用来指定后端服务器的地址或URL[端口]。

4、proxy_set_header

语法:proxy_set_header header value;

该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。

例如:

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_add_x_forwarded_for包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr

顺便补上Nginx的内置变量:

$args, 请求中的参数;

$is_args, 如果已经设置$args,则该变量的值为“?”,否则为“”。

$content_length, HTTP请求信息头里的"Content-Length";

$content_type, 请求信息头里的"Content-Type";

$document_root, 针对当前请求所属的root指令设置的根目录路径;

$document_uri, 与$uri相同;

$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

$limit_rate, 对连接速率的限制;

$request_method, 请求的方法,比如"GET"、"POST"等;

$remote_addr, 客户端地址;

$remote_port, 客户端端口号;

$remote_user, 客户端用户名,认证用;

$request_filename, 当前请求的文件路径名

$request_body_file, 客户端请求主体的临时文件名。

$request_uri, 请求的URI,带参数;

$query_string, 与$args相同;

$scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;

$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);

$server_name, 请求到达的服务器名;

$server_port, 请求到达的服务器端口号;

$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

5、proxy_read_timeout

语法:proxy_read_timeout time;

这个指令设置Nginx与后端服务器建立连接后。等待后端服务器的响应时间

6、proxy_send_timeout

语法:roxy_send_timeout time;

该指令指定请求转移到后端服务器的超时时间。整个传输的要求时间不超过超时时间,但只有两次写操作之间。如果在此时间之后的后端服务器将不采取新的数据,然后nginx将关闭连接。

7、proxy_connect_timeout

语法:proxy_connect_timeout time;

该指令用来设置分配到后端服务器的连接超时时间。

8、proxy_buffers

语法: proxy_buffers the_number is_size;

该指令设置缓冲区的数目和大小,缺省情况下,一个缓冲区的大小和页面大小相同。

9、proxy_buffer_size

语法:proxy_buffer_size buffer_size;

代理缓冲区,该指令用于保存用用户的头部信息。

10、proxy_busy_buffers_size

语法:proxy_busy_buffers_size size;

用于当系统负载较大,缓冲区不够用时,可以申请更大的proxy_buffers

11、proxy_temp_file_write_size

语法:proxy_temp_file_write_size size;

用于指定缓存临时文件的大小

(三)、功能完善

安装配置第三方模块,实现upstream中对后端web server的健康状态检测:

模块下载地址:;模块名称:ngx_http_healthcheck_module

安装配置方法:

1、首先解压healcheck模块到某路径下,这里假设为/tmp/healthcheck_nginx_upstreams

#tar -xvf cep21-healthcheck_nginx_upstreams-16d6ae7.tar.gz -C /tmp/healthcheck_nginx_upstreams

2、对nginx打补丁

首先解压nginx,并进入nginx源码目录:

# tar xf nginx-1.3.4.tar.gz

# cd nginx-1.0.11

# patch -p1 /tmp/healthcheck_nginx_upstreams/nginx.patch

而后编译nginx,在执行configure时添加类似下面的选项:

--add-module=/tmp/healthcheck_nginx_upstreams

所以,这里就使用如下命令:

# ./configure \

--prefix=/usr/local/nginx \

--sbin-path=/usr/sbin/nginx \

--conf-path=/etc/nginx/nginx.conf \

--lock-path=/var/lock/nginx.lock \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_flv_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--http-proxy-temp-path=/var/tmp/nginx/proxy/ \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

--with-pcre \

--add-module=/tmp/healthcheck_nginx_upstreams

# make make install

ngx_http_healthcheck_module模块的使用方法:

1、此模块支持的指令有:

healthcheck_enabled

##启用此模块

healthcheck_delay

##对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000;

healthcheck_timeout

##进行一次健康检测的超时时间,单位为毫秒,默认值2000;

healthcheck_failcount

##对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器;

healthcheck_send

##为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: coolinuz.9966.org';

healthcheck_expected

##期望从后端服务器收到的响应内容;如果未设置,则表示从后端服务器收到200状态码即为正确;

healthcheck_buffer

##健康状态检查所使用的buffer空间大小;

healthcheck_status

通过类似stub_status的方式输出检测信息,使用方法如下:

location /stat {

healthcheck_status;

}

(四)、配置与实现

配置代码如下:

http {

upstream web_pool {

server 172.23.136.148:80 weight=10;

server 172.23.136.149:80 weight=5;

healthcheck_enabled;

healthcheck_delay 1000;

healthcheck_timeout 1000;

healthcheck_failcount 2;

healthcheck_send "GET /.health HTTP/1.0";

}

server {

listen 80;

location / {

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass ;

proxy_connect_timeout 3;

}

location /stat {

healthcheck_status;

}

}

}

在这里设置“proxy_set_header”参数,是因为Nginx在做反向代理的时候,要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,或者后端web服务器上有多个基于域名的虚拟主机时,就要通过添加Header头信息Host,用于指定请求的域名,这样后端web服务器才能识别该反向代理访问请求由哪个虚拟主机来处理。

(五)、小结

通过以上我们可以看出Nginx的配置其实是比较其他的web服务器软件是比较简单的,但是其实现的功能确实相当强大丰富的。通过Nginx的反向代理已经支持灵活的正则表达式匹配,可以实现网站的动、静分离,让动态的php等程序网页去访问php web服务器,让缓存页、图片、javascript、css、flash去访问Squid等缓存服务器或文件服务器。加之Nginx对静态内容的高性能,高并发量,Nginx作为前端代理负载均衡成为越来越多架构师的首先方案。

如何安装nginx

nginx

windows版

v1.13.3免费版

nginx

windows安装配置方法

第一步、安装方法

一、下载好后,把nginx

windows版软件解压到c盘根目录。

二、双击nginx.exe图标,可见黑窗口一闪而过,启动完毕。

三、按下win+R快捷键,输入cmd打开命令行。

四、命令行到nginx目录,输入nginx启动。(注,此方式命令行窗口无任何提示,且被锁定)

五、打开浏览器,输入,如果看到下图片则安装成功。

六、以后启动软件直接双击图标即可。

七、启动后,默认情况下(无修改配置),可见到有两个nginx的进程,一个是master

process,一个是worker

processes测试。

第二步、配置方法

配置目标:能正常运行PHP脚本程序

大部分情况下,我们需要修改的配置文件只有一个,那就是nginx.conf,该文件位于conf目录下。具体配置项目为:

1.

server_tokens

off;

出于安全方面的考虑,最好是隐藏nginx版本号信息

2.

listen

8088;

8088为监听端口,根据需要可以填写其它端口号

3.

server_name

localhost;

localhost为服务器访问名称,也就是我们在浏览器里输入的那个url地址

4.

charset

utf-8;

字符集编码

5.

工作目录

将如下配置

修改为:

root

定义了工作空间,也就是我们php项目所在的目录。

加入index.php是为了让nginx能够识别php脚本,否则,在访问php文件时,会出现直接下载的情况。

6.

整合php

将location

~

\.php配置部分的注释全部去掉,最终配置如下:

注意这里面的$document_root变量,它对应的内容就是root参数值,如果我们没有定义root参数或者把root注释掉,在访问php的时候,页面上就会出现No

input

file

specified.提示。

7.

启动php-cgi

打开cmd命令窗口,切换到php的安装目录,执行php-cgi

-b

127.0.0.1:9000,即可启动php-cgi,启动完成后,cmd窗口切勿关闭,否则php-cgi也会被关掉的。

特别提醒:只有在开启php-cgi的情况下,nginx才能正常访问php。

8.

重启nginx

打开cmd命令窗口,切换到nginx所在目录,执行nginx

-s

reload即可重启nginx。其它相关nginx相关命令如下:

启动:start

nginx

停止:nginx

-s

stop

退出:nginx

-s

quit

window版本的nginx能重新编译吗?如何添加新的模块呢

找到安装nginx的源码根目录,如果没有的话下载新的源码

tar xvzf nginx-1.3.2.tar.gz

查看ngixn版本极其编译参数

/usr/local/nginx/sbin/nginx -V

进入nginx源码目录

cd nginx-1.3.2

以下是重新编译的代码和模块

./configure --prefix=/usr/local/nginx--with-http_stub_status_module

--with-http_ssl_module --with-file-aio --with-http_realip_module

make 千万别make install,否则就覆盖安装了

make完之后在objs目录下就多了个nginx,这个就是新版本的程序了

备份旧的nginx程序

cp /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.bak

把新的nginx程序覆盖旧的

cp objs/nginx /usr/local/nginx/sbin/nginx

测试新的nginx程序是否正确

/usr/local/nginx/sbin/nginx -t

nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful

平滑重启nginx

/usr/local/nginx/sbin/nginx -s reload

查看ngixn版本极其编译参数

/usr/local/nginx/sbin/nginx -V

这是我重新编译的代码:

./configure --prefix=/usr/local/nginx --with-google_perftools_module

--user=www --group=www --with-http_stub_status_module

--with-http_gzip_static_module --with-openssl=/usr/

--with-pcre=/mydata/soft/pcre-8.31

nginx配置文件路径

若是yum安装的,在/etc/nginx/nginx.conf以及conf.d目录下。

若源码安装的在你安装目录下的/conf下。

如果还是找不到可以使用一下命令搜索一下:

find / -name nginx.conf

发表评论

评论列表

  • 冢渊寄认(2022-06-14 23:04:47)回复取消回复

    erver语句中不能写入weight等其他的参数,hash_method是使用的hash算法upstream web_pool {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;}

  • 绿邪酒奴(2022-06-15 10:33:41)回复取消回复

    k_timeout##进行一次健康检测的超时时间,单位为毫秒,默认值2000;healthcheck_failcount##对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器;healthcheck_send##为了检测后端服务器的

  • 笑羞容(2022-06-15 02:14:16)回复取消回复

    务器,如果后端服务器down掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。2、weight指定在轮询的基础上加上权重,weight和访问比率成正比,即用于表明后端服务器的性

  • 双笙七禾(2022-06-15 06:08:23)回复取消回复

    用或禁用此服务器;healthcheck_send##为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: cool

  • 世味痞唇(2022-06-14 22:44:35)回复取消回复

    sten8088;8088为监听端口,根据需要可以填写其它端口号3.server_namelocalhost;localhost为服务器访问名称,也就是我们在浏览器里输入的那个url地址4.charsetutf-8;字符集编码5.工作目录将如下配置修改为:root定义了工作空间,也就是