Nginx应用场景

反向代理

反向代理:简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

下面贴上一段简单的实现反向代理的代码:

1
2
3
4
5
6
7
8
9
server { 
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host:$server_port;
}
}

保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问 localhost:8080 了。

负载均衡

负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其他关键任务服务器等,从而共同完成工作任务。

简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

RR(默认)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}

负载均衡的核心代码:

1
2
3
4
upstream test {
server localhost:8080;
server localhost:8081;
}

权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

1
2
3
4
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}

那么10次一般只会有1次会访问到8081,而有9次会访问到8080。

ip_hash(session保持)

上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

1
2
3
4
5
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}

fair(第三方)

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

1
2
3
4
5
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

1
2
3
4
5
6
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器。

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root E:/wwwroot;
index index.html;
}
}

这样如果访问就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

动静分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
upstream test{ 
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
location / {
root e:/wwwroot;
index index.html;
}
# 所有静态请求都由nginx处理,存放目录为html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:/wwwroot;
}
# 所有动态请求都转发给tomcat处理
location ~ .(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:/wwwroot;
}
}

这样就可以将HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了

Nginx 配置文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。

  5. location块:配置请求的路由,以及各种页面的处理情况。


附上一个配置文件,作为参考理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug;
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}


http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
#自定义格式
access_log log/access.log myFormat;
#combined为日志格式的默认值
sendfile on;
#允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k;
#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65;
#连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup;
#热备
}
error_page 404 https://www.baidu.com;
#错误页
server {
keepalive_requests 120;
#单连接请求上限次数。
listen 4545;
#监听端口
server_name 127.0.0.1;
#监听地址
location ~*^.+$ {
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path;
#根目录
#index vv.txt;
#设置默认页
proxy_pass http://mysvr;
#请求转向mysvr 定义的服务器列表
deny 127.0.0.1;
#拒绝的ip
allow 172.18.5.54;
#允许的ip
} }}

上面是nginx的基本配置,需要注意的有以下几点:

    • $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
    • $remote_user :用来记录客户端用户名称;
    • $time_local : 用来记录访问时间与时区;
    • $request : 用来记录请求的url与http协议;
    • $status : 用来记录请求状态;成功是200;
    • $body_bytes_s ent :记录发送给客户端文件主体内容大小;
    • $http_referer :用来记录从那个页面链接访问过来的;
    • $http_user_agent :记录客户端浏览器的相关信息;
  1. 惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

  2. 每个指令必须有分号结束。

本文标题:Nginx应用场景

文章作者:王洪博

发布时间:2018年05月16日 - 18:05

最后更新:2019年09月18日 - 08:09

原始链接:http://whb1990.github.io/posts/cd76424b.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%