介绍

软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。
官网:http://nginx.org


安装

因为他是C语言的,所以下载下来的源码需要编译才能运行

  • gcc编译器是否安装
    检查是否安装:yum list installed | grep gcc
    执行安装:yum install gcc -y
  • openssl库是否安装
    检查是否安装:yum list installed | grep openssl
    执行安装:yum install openssl openssl-devel -y
  • pcre库是否安装
    检查是否安装:yum list installed | grep pcre
    执行安装:yum install pcre pcre-devel -y
  • zlib库是否安装
    检查是否安装:yum list installed | grep zlib
    执行安装:yum install zlib zlib-devel -y
  • 一次性安装,执行如下命令
    yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.14.2.tar.gz
切换至解压后的nginx主目录,执行命令:cd nginx-1.14.2
在nginx主目录nginx-1.14.2下执行命令:./configure --prefix=/usr/local/nginx
(其中–prefix是指定nginx安装路径) 注意:等号左右不要有空格

执行命令进行编译:make
执行命令进行安装:make install
安装成功后,可以切换到/usr/local/nginx目录下,查看内容
有 conf html logs sbin 目录

常用命令

切换到nginx安装目录的sbin目录下,执行:

  • 普通启动
    ./nginx

  • 通过配置文件启动
    ./nginx -c /usr/local/nginx/conf/nginx.conf

  • 查看进程
    nginx 体系结构由 master 进程和其 worker 进程组成
    master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理
    Nginx启动后,安装目录下会出现一些_tmp结尾的文件,这些是临时文件,不用管。
    ps -ef | grep nginx

  • 优雅关闭
    这种关闭方式会处理完请求后再关闭,所以称之为优雅的关闭,
    主pid为master,其他为子进程worker
    kill -QUIT 主pid

  • 快速关闭Nginx:
    这种关闭方式不管请求是否处理完成,直接关闭,比较暴力,称之为快速的关闭
    kill -TERM 主pid

  • 重启
    ./nginx -s reload

  • 配置检查
    ./nginx -c /usr/local/nginx/conf/nginx.conf -t

静态网站部署

例子:将静态ace网站部署到Nginx服务器上

把文件上传到/opt/static/
修改nginx配置文件(注意层级在http—>server—>location)
注意要以分号结尾

通过ip直接访问

1
2
3
4
location / {
root /opt/packages/ace;
index index.html index.htm;
}

重启nginx,输入IP便能访问
例如:http://192.168.235.128:80

通过ip+路径访问

1
2
3
4
location /ace {
root /opt/static/;
index index.html index.htm;
}

重启nginx,输入IP+/ace便能访问
例如:http://192.168.235.128:80/ace

负载均衡

用户访问nginx,让他自动调度服务(此处是tomcat)

修改配置文件
(注意层级在,http—>upstream)
127.0.0.1:9100和127.0.0.1:9200是两台tomcat

1
2
3
4
upstream www.myweb.com { 
server 127.0.0.1:9100;
server 127.0.0.1:9200;
}

再在server模块里添加location,并配置proxy_pass
其中 www.myweb.com 字符串要和 upstream 后面的字符串相等

1
2
3
location /myweb {
proxy_pass http://www.myweb.com;
}

ip+myweb便能访问
例如:http://192.168.235.128:80/myweb

常用负载均衡策略

  • 轮询(默认)
    注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除

    1
    2
    3
    4
    upstream backserver { 
    server 127.0.0.1:8080;
    server 127.0.0.1:9090;
    }
  • 权重
    每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况

    1
    2
    3
    4
    upstream backserver { 
    server 192.168.0.14 weight=5;
    server 192.168.0.15 weight=2;
    }
  • ip_hash
    ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
    算法:hash(“124.207.55.82”) % 2 = 0, 1

    1
    2
    3
    4
    5
    upstream backserver { 
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:9090;
    }
  • 最少连接
    web请求会被转发到连接数最少的服务器上

    1
    2
    3
    4
    5
    upstream backserver { 
    least_conn;
    server 127.0.0.1:8080;
    server 127.0.0.1:9090;
    }

静态代理

把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。

方式一

在nginx.conf的location中配置静态资源的后缀

例如:当访问静态资源,则从linux服务器/opt/static目录下获取(举例)

1
2
3
4
5
6
7
8
9
10
11
12
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}


说明:
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
第一个点 . 表示任意字符
*表示一个或多个字符
\. 是转移字符,是后面这个点的转移字符
| 表示或者
$ 表示结尾

整个配置表示以 .后面括号里面的这些后缀结尾的文件都由nginx处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限;
否则会出现403错误 chmod 755

方式二

在nginx.conf的location中配置静态资源所在目录实现

例如:当访问静态资源,则从linux服务器/opt/static目录下获取(举例)

1
2
3
location ~ .*/(css|js|img|image) {
root /opt/static;
}

我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源

动静分离

Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
它们各司其职,专注于做自己擅长的事情
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构

虚拟主机

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
例如:www.meituan.com 切换城市,可以看到不同的城市地址不一样(二级域名)
比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。

基于端口的虚拟主机

基于端口的虚拟主机配置,使用端口来区分
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;

基于域名的虚拟主机

基于域名的虚拟主机是最常见的一种虚拟主机

域名解析也需要设置,这里不多赘述

说明:
9100、9200、9300端口是tomcat服务
nginx一直监听80端口
如果用户访问http://beijing.pengyirui.spac时,会转跳到以beijing.myweb.com为名的tomcat服务

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
upstream beijing.myweb.com {
server 127.0.0.1:9100;
}
upstream nanjing.myweb.com {
server 127.0.0.1:9200;
}
upstream tianjin.myweb.com {
server 127.0.0.1:9300;
}

server {
listen 80;
server_name beijing.pengyirui.space;
location / {
proxy_pass http://beijing.myweb.com;
}
}

server {
listen 80;
server_name nanjing.pengyirui.space;
location / {
proxy_pass http://nanjing.myweb.com;
}
}

server {
listen 80;
server_name tianjin.pengyirui.space;
location / {
proxy_pass http://tianjin.myweb.com;
}
}

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
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 1;

#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

pid logs/nginx.pid; #配置进程pid文件


###====================================================


#配置工作模式和连接数
events {
worker_connections 1024; #配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
}

###===================================================


#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
include mime.types;
#默认文件类型 流类型,可以理解为支持任意类型
default_type application/octet-stream;
#配置日志格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#配置access.log日志及存放路径,并使用上面定义的main日志格式
#access_log logs/access.log main;

sendfile on; #开启高效文件传输模式
#tcp_nopush on; #防止网络阻塞

#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒

#gzip on; #开启gzip压缩输出

###-----------------------------------------------


#配置虚拟主机
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名

#charset koi8-r; #配置字符集

#access_log logs/host.access.log main; #配置本虚拟主机的访问日志

#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
#root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
root html;
#配置首页文件的名称
index index.html index.htm;
}

#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x错误页面

#精确匹配
location = /50x.html {
root html;
}

#PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

#PHP 脚本请求全部转发到FastCGI处理
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

#禁止访问 .htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


#配置另一个虚拟主机
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


#配置https服务,安全的网络传输协议,加密传输,端口443,运维来配置
#
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}
}