linux下Nginx安装
1、安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
5、下载安装包
手动下载.tar.gz安装包,地址:https://nginx.org/en/download.html
下载完毕上传到服务器上 /root
6、解压
tar -zxvf nginx-1.18.0.tar.gzcd nginx-1.18.0
7、配置
使用默认配置,在nginx根目录下执行
./configure --with-http_ssl_module
make
make install
查找安装路径: whereis nginx
Nginx常用命令
cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
反向代理
1、应用安装
1、准备一个Linux环境(推荐使用数审镜像)
2、配置好IP以及DNS,确保网络可达。
3、安装宝塔应用
curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh
SSL选择关闭,其他均为yes
出现以下页面及安装成功
关闭安全入口
rm -f /www/server/panel/data/admin_path.pl
点击链接即可访问
使用上面的账号密码登录
注册一个宝塔账号
登录后即可进入应用
修改账号密码
2、Nginx配置修改
1、Nginx添加上述应用代理
修改以下配置
listen:修改为需要监听的端口
proxy_pass:修改为上述ip端口
server {
listen 82;
server_name _;
location / {
proxy_pass http://172.24.3.187:19222/login; # 设置要转发的目标服务器
proxy_set_header Host 172.24.3.187:19222; # 设置 Host 头信息
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://172.24.3.187:19222;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
#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;
}
}
修改完配置之后,重新加载Nginx
进入sbin目录
cd /usr/local/nginx/sbin/
./nginx -s reload
2、Nginx完整配置示例
#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;
server {
listen 80;
server_name _;
location / {
proxy_pass http://172.24.3.231:11879/login; # 设置要转发的目标服务器
proxy_set_header Host 172.24.3.231:11879; # 设置 Host 头信息
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://172.24.3.231:11879;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
#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;
}
}
server {
listen 82;
server_name _;
location / {
proxy_pass http://172.24.3.187:19222/login; # 设置要转发的目标服务器
proxy_set_header Host 172.24.3.187:19222; # 设置 Host 头信息
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://172.24.3.187:19222;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
#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;
}
}
server {
listen 81;
server_name _;
location / {
proxy_pass http://xxx.xx.xx.xx:33920/login; # 设置要转发的目标服务器
proxy_set_header Host $http_host; # 设置 Host 头信息
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://172.24.2.4:33920;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
#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;
}
}
}
其中多个server可以对应多个监听的端口,扩展配置只需要复制server修改ip端口即可。
到此代理以及完成!
3、nginx代理出现静态资源读取不到
原因:读取到是nginx服务器地址下的静态资源,而非被代理服务器的静态资源。
解决:设置如下,形似动静分离
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://192.168.93.105;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
主要作用是 proxy_set_header Host h t t p h o s t ∗ ∗ 中 ∗ ∗ http_host** 中 ** httphost∗∗中∗∗http_host,如果 $host 依旧不会有效。该处原因暂未明确
反向代理可以直接在location 中指定 proxy_pass http://192.168.93.105:8082; 或者 通过 upstream domain 指定服务组,然后指定服务组名(domain)进行代理:proxy_pass http://server_8082; 。
location / {
# 反向代理。负载均衡可通过upstream设置多个服务器
proxy_pass http://server_8082;
# proxy_pass http://192.168.93.105:8082;
# 下面几个配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#root html;
index index.html index.htm;
}
# 设置负载服务器池(服务组),如果有域名采用域名作为名称
upstream server_8082 {
server 192.168.93.105:8082 weight=2;
#server 192.168.0.105:8083 weight=1;
}
server {
listen 8082;
server_name localhost;
location / {
# 反向代理。负载均衡可通过upstream设置多个服务器
proxy_pass http://server_8082;
# proxy_pass http://192.168.93.105:8082;
# 下面几个配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#root html;
index index.html index.htm;
}
# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
proxy_pass http://server_8082;
# proxy_pass http://192.168.93.105:8082;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
负载均衡
由于需要使用分布式部署,所以搭建的应用需要支持Session共享多模块
1、依赖安装
安装Redis
下载地址 http://download.redis.io/releases/redis-5.0.7.tar.gz
-
下载获得 redis-5.0.7.tar.gz 后将它放到我们Linux的目录下 /opt
-
/opt 目录下,解压命令 :
tar -zxvf redis-5.0.7.tar.gz
-
解压完成后出现文件夹:
redis-5.0.7
-
安装依赖
yum install gcc-c++
-
进入目录:
cd redis-5.0.7
-
在 redis-5.0.7 目录下执行
make
命令 -
如果make完成后继续执行
make install
-
查看默认安装目录:
修改配置文件
# 允许任何主机连接、访问
bind 127.0.0.1 改为 bind 0.0.0.0
# 关闭保护模式
protected-mode yes 改为 protected-mode no
# 允许启动后在后台运行,即关闭命令行窗口后仍能运行
daemonize no 改为 daemonize yes
防火墙添加6379端口
后台启动redis
cd /usr/local/bin
nohup redis-server /usr/local/redis-5.0.7/redis.conf &
测试
有响应即可
2、应用安装
ROUYI最新版本(2018-11-22)集成redis,将session放入redis,可实现集群部署;
地址:https://gitee.com/duzunwu512/RuoYi
1、通过git下拉代码
2、修改配置文件中的账号密码,ip端口
3、修改mysql版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
4、修改连接池配置
主要修改数据源配置url、username、password
修改redis的配置host、port
两个环境使用同一个mysql以及redis
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://xxx.xx.xx.x:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: ********
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initial-size: 10
# 最大连接池数量
max-active: 100
# 最小连接池数量
min-idle: 10
# 配置获取连接等待超时的时间
max-wait: 60000
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /monitor/druid/*
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
redis:
# Redis开关/默认关闭
enabled: true
database: 0
password:
host: xxx.xx.xx.x
port: 6379
lettuce:
pool:
max-active: 100 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 100 # 连接池中的最大空闲连接
min-idle: 50 # 连接池中的最小空闲连接
max-wait: 6000 # 连接池最大阻塞等待时间(使用负值表示没有限制)
timeout: 1000
5、修改服务端口
6、打包
使用maven打包即可,找到图中对应的jar包
7、初始化数据库
使用Navicat连接数据库,新建ry数据库
将以下两个sql文件初始化到库中
8、部署
将上述jar包上传至任意目录,直接执行
nohup java -jar ruoyi-admin.jar &
同时在多个环境执行都可以
查看日志出现下图即启动成功
记录部署环境ip即服务端口,可直接页面访问。
3、Nginx配置修改
1、直接替换下述配置文件
#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;
upstream testServer {
server 172.24.2.4:8088;
server 172.24.3.231:8088;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://testServer;
proxy_set_header Host http://testServer; # 设置 Host 头信息
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
location ~ .* {
proxy_pass http://testServer;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}
}
}
2、主要修改以下内容,替换其中的ip端口为上述若依应用的ip端口即可
upstream testServer {
server 172.24.2.4:8088;
server 172.24.3.231:8088;
}
3、配置后重新加载Nginx配置
4、直接访问Nginx的服务加端口即可
通过日志可以发现,是两台服务随机处理的请求
到此、负载均衡部署成功!
5、负载均衡策略
策略 | 描述 |
---|---|
轮询 | 默认方式 |
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 最少连接方式 |
1、轮询
最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
- 在轮询中,如果服务器down掉了,会自动剔除该服务器。
- 缺省配置就是轮询策略。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
2、weight
#动态服务器组
upstream dynamic_zuoyu {
server localhost:8080 weight=2;
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
}
参数 | 描述 |
---|---|
fail_timeout | 与max_fails结合使用。 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了, |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。 |
down | 标记服务器永久停机了。 |
- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况。
3、ip_hash
#动态服务器组
upstream dynamic_zuoyu {
ip_hash;
server localhost:8080 weight=2;
server localhost:8081;
server localhost:8082;
server localhost:8083 max_fails=3 fail_timeout=20s;
}
- ip_hash不能与backup同时使用。
- 此策略适合有状态服务,比如session。
- 当有服务器需要剔除,必须手动down掉。
此方式对接口只会一直走同一个ip上的服务,固定访问一个后端服务器
4、least_conn
#动态服务器组
upstream dynamic_zuoyu {
least_conn; #把请求转发给连接数较少的后端服务器
server localhost:8080 weight=2;
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
}
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。