nginx系列(一)安装与配置

安装nginx

本博主是在centos7的基础上进行搭建nginx的,可能由于之前搭建的有一些工具,故在安装nginx的时候为安装任何依赖。正常情况我们需要判断下面是否进行安装。

  • gcc g++ 用来编译nginx
  • PCRE库
  • zlib库
  • openssl(某些vps默认没有安装ssl)

下载nginx

下载地址 nginx下载

其中Stable version为稳定版,Legacy versions为历史版本,Mainline version为最新版本。我下载的为Stable version中的nginx-1.16.0

查看nginx版本

如果不清楚是否安装过nginx,可以进行命令查看版本nginx -v

1
2
3
nginx -v
# 结果
nginx version: nginx/1.16.0

解压与编译

将下载好的nginx版本放到虚拟机中,目录自己定义,我选择目录为/usr/java,进行解压 ,并进入解压后文件夹,编译进行启动

1
2
3
4
5
6
7
8
9
# 解压文件
tar -zxvf nginx-1.16.0

# 进入解压文件夹
cd nginx-1.16.0/
./configure
# 编译
make
make install

由于未进行配置,故在安装的时候安装目录为默认路径 “/usr/local/nginx”

nginx启动

nginx的启动地址为:/usr/local/nginx/sbin ,下面有nginx命令,进行执行即可启动。

查看是否启动成功:

1
2
3
4
5
ps -ef | grep nginx
# 结果显示
root 52807 1 0 Jul05 ? 00:00:00 nginx: master process ./nginx
nobody 52808 52807 0 Jul05 ? 00:00:00 nginx: worker process
root 67376 53051 0 06:16 pts/2 00:00:00 grep --color=auto nginx

也可以使用其他命令查看是否启动成功

1
2
3
4
5
6
7
netstat -ntpl
# 结果为,本博主仅选取了前几行,可以看到下面最后一行最后显示的有nginx
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.2.163:6379 0.0.0.0:* LISTEN 18048/./bin/redis-s
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 52807/nginx: m

nginx停止

  • 命令停止
1
2
3
4
5
# 停止
[root@localhost sbin]# ./nginx -s stop
# 查看进程
[root@localhost sbin]# ps -ef | grep nginx
root 67495 53051 0 06:26 pts/2 00:00:00 grep --color=auto nginx
  • kill 进程

​ kill 掉master进程

1
2
3
4
5
6
7
8
[root@localhost sbin]# ps -ef | grep nginx
root 67545 1 0 06:30 ? 00:00:00 nginx: master process ./nginx
nobody 67546 67545 0 06:30 ? 00:00:00 nginx: worker process
root 67548 53051 0 06:30 pts/2 00:00:00 grep --color=auto nginx
[root@localhost sbin]# kill -9 67545
[root@localhost sbin]# ps -ef | grep nginx
nobody 67546 1 0 06:30 ? 00:00:00 nginx: worker process
root 67550 53051 0 06:30 pts/2 00:00:00 grep --color=auto nginx

nginx配置

此时我们的搭载的是两台虚拟机,其中一台装有nginx,两台都有tomcat,此时我们进行配置nginx

由于博主版本安装为1.16版的,不同的版本可能配置文件不一样。

1
/usr/local/nginx/conf

在上main目录下,进行修改配置文件nginx.conf,在server上面增加下面内容

1
2
3
4
upstream myTomcatServer {
server 192.168.2.163:8080;
server 192.168.2.228:8080;
}

在location中增加代理设置

1
2
3
4
5
6
location / {
root html;
index index.html index.htm;
# 下面一句为增加内容
proxy_pass http://myTomcatServer;
}

修改后的文件内容为:

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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
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 logs/access.log main;

sendfile on;
#tcp_nopush on;

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
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 logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;
upstream myTomcatServer {
server 192.168.2.163:8080;
server 192.168.2.228:8080;
}

server {
listen 80;
server 192.168.2.163:8080;
server 192.168.2.228:8080;
}

keepalive_timeout 65;

#gzip on;
upstream myTomcatServer {
server 192.168.2.163:8080;
server 192.168.2.228:8080;
}

server {
listen 80;
server_name localhost;






#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
proxy_pass http://myTomcatServer;
}

#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# 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;
#}

# 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 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;
# }
#}

}

校验配置文件的正确性

命令为:nginx -t

1
2
3
[root@localhost conf]# ../sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重新加载配置文件

命令为:nginx -s reload

1
[root@localhost conf]# ../sbin/nginx -s reload

负载均衡集群校验

启动两个环境中的tomcat,进行访问

一开始显示无法访问,tomcat启动日常,进行考虑可能由于虚拟机防火墙导致,故将防火墙关闭后发现可以正常访问。

防火墙

centos7采用的是firewalled

查看防火墙状态:

1
2
3
firewall-cmd --state
# 结果
running

关闭并禁止开机启动

1
2
3
4
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动
systemctl disable firewalld.service

校验

输入niginx地址,并加入请求路径,并多次刷新查看结果(默认端口80或者省略不写)

1
http://192.168.2.163/gms/index.html  # nginx地址为163

nginx负载均衡策略

上述采用的是默认策略。

  1. 轮询 -> 默认方式
  2. weight -> 权重方式
  3. ip_hash -> 依据ip分配方式
  4. least_conn -> 最少连接方式
  5. fair (第三方) -> 响应时间方式
  6. url_hash(第三方) -> 依据url方式

轮询

最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

参数如下

参数参数名称
fail_timeout与max_fails结合使用
max_fails设置在fail_timeout参数设置的时间内最大失败次数,在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down标记服务器永久停机了

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器
  • 缺省配置就是轮询策略
  • 此策略适合服务器配置相当,无状态且短平快的服务使用

weight

权重方式,在轮询策略的基础上指定轮询的几率

如下所示:

1
2
3
4
upstream myTomcatServer {
server 192.168.2.163:8080 weight=2;
server 192.168.2.228:8080 max_fails=3 fail_timeout=20s;
}

weight参数用于指定轮询的几率,weight默认为1,weight的数值与访问比例成正比,比如weight为2 的访问几率是默认为1的2倍。

注意:

  • 权重越高分配到需要处理的请求越多
  • 此策略可以与least_conn和ip_hash结合使用
  • 此策略比较适合服务器的硬件配置差别比较大的情况

ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题

1
2
3
4
5
upstream myTomcatServer {
ip_hash;
server 192.168.2.163:8080 weight=2;
server 192.168.2.228:8080 max_fails=3 fail_timeout=20s;
}

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
  • ip_hash不能与backup同时使用
  • 此策略适合有状态服务,比如session
  • 当有服务器需要剔除,必须手动down掉

least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

1
2
3
4
5
6
upstream myTomcatServer {
# ip_hash;
least_conn;
server 192.168.2.163:8080 weight=2;
server 192.168.2.228:8080 max_fails=3 fail_timeout=20s;
}

注意:

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况

第三方策略

第三方的负载均衡策略的实现需要安装第三方插件

fair

在server的下一行增加

1
2
3
4
5
6
7
8
upstream myTomcatServer {
hash $request_url ; #实现每个url定向到同一个后端服务器
# ip_hash;
#least_conn;
server 192.168.2.163:8080 weight=2;
server 192.168.2.228:8080 max_fails=3 fail_timeout=20s;
# fair; #实现响应时间短的优先分配
}

url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

1
2
3
4
5
6
7
8
upstream myTomcatServer {
hash $request_url ; #实现每个url定向到同一个后端服务器
# ip_hash;
#least_conn;
server 192.168.2.163:8080 weight=2;
server 192.168.2.228:8080 max_fails=3 fail_timeout=20s;
# fair; #实现响应时间短的优先分配
}

本文标题:nginx系列(一)安装与配置

文章作者:wsylp

发布时间:2019年07月07日 - 22:07

最后更新:2020年01月02日 - 10:01

原始链接:http://wsylp.top/2019/07/07/nginx系列-一安装与配置/

许可协议: 本文为 wsylp 版权所有 转载请保留原文链接及作者。

-------------本文结束感谢阅读-------------