Nginx学习

Nginx学习

背景

1、在项目最开始的时候,低并发情形下,一个客户端,一个服务器即可满足要求

img

2、随着平台的用户数增加,并发的需求量增加,一台服务器无法满足我们要求

img

3、进行横向扩展,增加服务器,这时,几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器,通过代理服务器来帮我们转发和处理请求。

img

4、我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证用户最佳体验!所以使用了Nginx

1、什么是Nginx?

Nginx(engine x)是一个高性能的HTTP和反向代理web服务器。

2、Nginx作用?

Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。

3、正向代理

对客户端进行代理

img

4、反向代理

对服务端进行代理

img

5、负载均衡策略

5.1 内置策略

  • 轮询

    img

  • 加权轮询

    img

  • Ip Hash

    Ip Hash对客户端请求的IP进行Hash操作,然后根据Hash结果将同一个客户端的IP的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

img

5.2 扩展策略

自己想

6、环境配置

6.1 基础环境

  • gcc

    源码编译需要依赖gcc环境

    1
    yum install gcc-c++
  • pcre pcre-devel

    主要是nginx的http模块需要使用pcre来解析正则表达式

    1
    yum install -y pcre pcre-devel
  • zlib

    nginx使用zlib对http包的内容进行gzip

    1
    yum install -y zlib zlib-devel
  • OpenSSL

    1
    yum install -y openssl openssl-devel

6.2 Nginx安装

Nginx下载地址

1
2
3
4
5
6
wget https://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2/
./configure
make
make install

查看nginx安装路径

1
whereis nginx

1637855569630

Nginx常用命令

1
2
3
4
5
6
cd /usr/local/nginx/sbin # 进入启动目录
./nginx # 启动
./nginx -s stop # 停止
./nginx -s quit # 安全退出,需要先启动nginx
./nginx -s reload # 重新加载配置文件,需要先启动nginx
ps aux | grep nginx # 查看nginx进程 或 ps -ef | grep nginx

nginx启动后,访问ip:80,即可看到如下成功页面

腾讯云服务器需要安全组开放端口

1637856402367

6.3 Java配置

Java下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /usr/local
mkdir java
# 在windows上下载jdk-8u202-linux-x64.tar.gz文件,然后用远程工具上传至服务器
# 用wget无法下载jdk,需要登录Oracle账号,尝试登录几次都没有登录成功
# 将jdk-8u202-linux-x64.tar.gz拷贝至/usr/local/java目录
tar -zxvf jdk-8u202-linux-x64.tar.gz
vim /etc/profile
# 将如下代码拷贝至profile文件末尾
#export JAVA_HOME=/usr/local/java/jdk1.8.0_202
#export PATH=$PATH:$JAVA_HOME/bin
#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#export JRE_HOME=$JAVA_HOME/jre
# :wq 保存
source /etc/profile

1637856994644

查看java版本信息:

1
java -version

1637857113780

6.4 Tomcat配置

Tomcat下载地址

1
2
3
4
5
6
7
8
9
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz
cd /usr/local/
mkdir tomcat8
cd tomcat8/
cp apache-tomcat-8.5.73.tar.gz /usr/local/tomcat8/apache-tomcat-8.5.73.tar.gz
tar -zxvf apache-tomcat-8.5.73.tar.gz
cd apache-tomcat-8.5.73/
cd bin/
./startup.sh

部署完成后,启动Tomcat

1637857894337

1637858391291

7、Web项目部署

7.1 IEDA新建web项目

1、FILE -> NEW -> Moudle… ->Spring Initializr

img

下一步->下一步,Developer Tools勾选lambok,web勾选Spring Web

2、logback-spring.xml

在resources文件夹下创建该文件

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
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<!-- <configuration scan="true" scanPeriod="10 seconds">-->
<configuration>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- appender 输出到控制台
此日志appender是为开发使用,只配置最低级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<encoder> <!-- encoder 日志文件输出格式-->
<!-- 通过添加%red,“%”后面的是颜色名称,可以实现彩色日志输出,其格式为%red() -->
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符-->
<pattern>%red(%date) %green([%thread]) %highlight(%-5level) %boldMagenta([%logger{50}]) %file:%line - %cyan(%msg%n)</pattern>
<!-- <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>-->
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>

</appender>

<!--时间滚动输出,level为INFO日志,输出到文件-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!-- 此日志文件只记录info级别的
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
-->
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有
<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期
。即,<File> 的日志都是当天的。-->
<File>E:\java_example\springboot-logback-test\src\main\resources\logs\info.log</File>--><!-- 正在记录的日志文件的路径及文件名 -->
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>
E:\java_example\springboot-logback-test\src\main\resources\logs\info.created_on_%d{yyyy-MM-dd}.part_%i.log
</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>

<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<maxFileSize>1KB</maxFileSize>-->
<!--</triggeringPolicy>-->
<encoder> <!-- encoder 日志文件输出格式-->
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset><!-- 此处设置字符集 -->
</encoder>
</appender>

<!--时间滚动输出,level为ERROR日志-->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时
有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天
的日期。即,<File> 的日志都是当天的。-->
<!--<File>logs/error.spring-boot-demo-logback.log</File>-->
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>
logs/spring-boot-demo-logback/error.created_on_%d{yyyy-MM-dd}.part_%i.log
</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>

<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder> <!-- encoder 日志文件输出格式-->
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset><!-- 此处设置字符集 -->
</encoder>
</appender>

<!-- 指定appender级别,使用的是info级别-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>

3、Controller类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class TestController {

@RequestMapping(value="/test")
public String test(){
log.info("Test OK!");
return "OK";
}
}

4、运行Tomcat,访问http://localhost:8080/nginx/test

img

5、编译,生成war包

7.2 Linux下部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ps -ef | grep tomcat # 查看进程id
kill -9 进程id # 关闭tomcat
cd /usr/local/tomcat8/apache-tomcat-8.5.73/webapps/
cp springboot-logback-test-0.0.1-SNAPSHOT.war /usr/local/tomcat8/apache-tomcat-8.5.73/webapps/
rm -rf ROOT #删除tomcat下原有的ROOT文件
cd /usr/local/tomcat8/apache-tomcat-8.5.73/bin
./startup.sh
cd /usr/local/tomcat8/apache-tomcat-8.5.73/webapps/
mv springboot-logback-test-0.0.1-SNAPSHOT/ ROOT #将解压后的web项目改名为ROOT
cd ROOT/WEB-INF/classes
rm -rf logback-spring.xml #删除xml文件是因为在启动过程中报错,因此删除
cd /usr/local/tomcat8/apache-tomcat-8.5.73/bin
./shutdown.sh
./startup.sh

测试:

1
curl http://127.0.0.1:8080/test

1638276452873

1
2
cd /usr/local/tomcat8/apache-tomcat-8.5.73/logs
tail -n 100 catalina.out #查看输出内容

1638276560804

8、搭建两个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
ps -ef | grep tomcat # 查看进程id
kill -9 进程id # 关闭tomcat
cd /usr/local/tomcat8
cp -r apache-tomcat-8.5.73 tomcat-one
vim /etc/profile #在profile的尾部添加如下
# set tomcat
export CATALINA_HOME1=/usr/local/tomcat8/apache-tomcat-8.5.73
export CATALINA_BASE1=/usr/local/tomcat8/apache-tomcat-8.5.73
export TOMCAT_HOME1=/usr/local/tomcat8/apache-tomcat-8.5.73

# set tomcat-one
export CATALINA_HOME2=/usr/local/tomcat8/tomcat-one
export CATALINA_BASE2=/usr/local/tomcat8/tomcat-one
export TOMCAT_HOME2=/usr/local/tomcat8/tomcat-one
source /etc/profile
cd /usr/local/tomcat8/tomcat-one/conf/
vim server.xml
<Server port="8095" shutdown="SHUTDOWN"> # 将8005修改为8095
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> #将8080修改为8090
cd /usr/local/tomcat8/apache-tomcat-8.5.73/bin/
./startup.sh #启动tomcat1
cd /usr/local/tomcat8/tomcat-one/bin/
./startup.sh #启动tomcat2
1
ps -ef | grep tomcat #显示两个tomcat

1638277716190

1
2
curl http://127.0.0.1:8080/test
curl http://127.0.0.1:8090/test

1638277852571

查看两个tomcat下的catalina.out文件内容

1638278019522

9、Nginx代理配置

nginx.conf配置简单讲解

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 {
worker_connections 1024;
}

http{
http配置

upstream xx{
//负载均衡配置
}

server {
listen 80;
server_name localhost;
//代理

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

}

配置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
/usr/local/nginx/sbin
./nginx # 启动nginx
cd /usr/local/nginx/conf
vim nginx.conf
http {
http 配置 # 这里被简略

#gzip on;
# 添加负载均衡配置,其中test是名称,在后续会用到,weight是权重
upstream test {
server 127.0.0.1:8080 weight=1;# 要代理的ip和端口,权重为1
server 127.0.0.1:8090 weight=1;# 要代理的ip和端口,权重为1
}
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://test; #进行代理配置,test是前面负载均衡配置的名字
}
}
/usr/local/nginx/sbin
./nginx -s reload #重新加载配置

配置好后,默认用80端口

1
curl http://127.0.0.1/test

1638280183949

若多次运行,则可以在两个tomcat下的 catalina.out 文件中进行查看

1
2
3
4
5
6
7
curl http://127.0.0.1/test
curl http://127.0.0.1/test
# 输出
# 第一次在8080端口输出
2021-11-30 21:50:19.624 INFO 7588 --- [nio-8080-exec-5] c.l.s.Controller.TestController : Test OK!
# 第二次在8090端口输出
2021-11-30 21:50:49.385 INFO 9675 --- [nio-8090-exec-1] c.l.s.Controller.TestController : Test OK!

若修改权重,

1
2
3
4
5
6
7
8
9
# 在con/nging.conf中修改8090的权重
upstream test {
server 127.0.0.1:8080 weight=3;# 要代理的ip和端口,权重为3
server 127.0.0.1:8090 weight=1;# 要代理的ip和端口,权重为1
}

# 重新加载nginx
/usr/local/nginx/sbin
./nginx -s reload #重新加载配置

再次多次运行

1
2
3
4
5
6
7
8
9
10
curl http://127.0.0.1/test
curl http://127.0.0.1/test
curl http://127.0.0.1/test
curl http://127.0.0.1/test
# 8080端口,3次输出
2021-11-30 21:53:41.170 INFO 7588 --- [nio-8080-exec-6] c.l.s.Controller.TestController : Test OK!
2021-11-30 21:53:45.748 INFO 7588 --- [nio-8080-exec-7] c.l.s.Controller.TestController : Test OK!
2021-11-30 21:53:49.017 INFO 7588 --- [nio-8080-exec-8] c.l.s.Controller.TestController : Test OK!
# 8090端口一次输出
2021-11-30 21:53:47.518 INFO 9675 --- [nio-8090-exec-2] c.l.s.Controller.TestController : Test OK!

不足

web项目在linux上部署的时候,将logbach-spring.xml文件配置后,tomcat启动报错,在下次进行改进

0%