乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

使用nginx部署django项目需要注意的问题

发表于 2020-09-23

首先配置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
26
27
28
29
30
31
32
33
34
worker_processes  1;
events {
worker_connections 1024;
}
http{
server{
listen 80;
server_name py.newban.cn; #
root /usr/share/nginx/html/blog;
index index.html;
}
server{
listen 80;
server_name blog.newban.cn; #
root /usr/share/nginx/html/blog2;
index index.html;
}


#反向代理部分
upstream my.blog{ #部署django 名称不能使用下滑线分割比如my_blog 否则报错
server 118.10.25.17:8000 weight=1;
#负载均衡 随机访问 权重1:1 各占50%
server 118.10.25.17:8001 weight=1;
}
server{
listen 80;
server_name py.insoan.com; #
location / {
proxy_pass http://my.blog;
index index.html;
}
}
}

问题1 DisallowedHost at /

使用 nginx 部署django时,会出现下面的错误

  1. 首先使用的域名不符合 RFC 1034/1035.规范时,会出现下面的错误(如包含下划线)
1
DisallowedHost at /Invalid HTTP_HOST header: 'learning_log.cent.com'. The domain name provided is not valid according to RFC 1034/1035.
  1. 解决方式:

修改域名,去除下划线,即将 learning_log.cent.com 修改成 llog.cent.com

  1. 再重新访问出现另外一个错误
1
invalid http_host header
  1. 解决方式

将 setting.py 的 ALLOWED_HOSTS = [] 修改成 ALLOWED_HOSTS = [‘*’]

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

docker部署Django项目

发表于 2020-09-23

一、概述

已经写好了一个Django项目,需要将这个项目用docker封装一个镜像,使用k8s发布!

在封装并运行的过程中,发现了很多问题,这里会一一介绍!

二、时区问题

采用的是镜像是 ubuntu:16.04 默认的时区是UTC,比中国时间,晚了8个小时!

那么因此,需要将默认的时区给覆盖掉!

默认是没有安装 tzdata,因此没有 /usr/share/zoneinfo 目录!

安装tzdata,使用命令

1
apt-get install -y tzdata

设置时区为 上海,使用以下命令

1
2
TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

三、中文乱码问题

默认的系统编码是ascii,因此不支持中文!

需要安装 locales 软件包

1
apt-get install -y locales

设置utf-8编码

1
locale-gen en_US.UTF-8

设置全局变量

1
2
3
LANG en_US.UTF-8
LANGUAGE en_US:en
LC_ALL en_US.UTF-8

设置utf-8编码之后,那么在python的print命令,就可以输出中文了,而不会提示

1
'ascii' codec can't encode characters in position 8-50: ordinal not in range(128)

在python文件头部,记得增加一行代码,指定utf-8编码

1
# coding: utf-8

四、任务计划问题

启动问题

在ubuntu:16.04 的镜像中,默认是没有cron包的,所以需要手动安装

1
apt-get install -y cron

那么启动任务计划时,不能使用命令 /etc/init.d/cron start 以及 service cron start

在dockerfile中,会启动不成功的。

必须使用 /usr/sbin/cron 命令,才能启动成功!

添加问题

一般来讲,添加任务计划,直接修改 /etc/crontab 文件即可。

在dockerfile 中,不能使用echo EOF 等命令修改/etc/crontab文件

必须使用 sed 命令修改/etc/crontab文件,才能成功!

如果需要在最后一行添加任务计划,可以使用以下命令:

语法:

1
sed -i '$a需要添加的内容' 文件名

比如:

1
sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab

五、封装Django项目镜像

新建空目录

1
mkdir /opt/messagecenter

目录结构如下:

1
2
3
4
5
./
├── dockerfile
├── messagecenter.tar
├── run.sh
└── sources.list

dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD messagecenter.tar /
# 时区为上海
ENV TZ Asia/Shanghai

# 设置时区,设置utf-8编码,安装django,添加任务计划
RUN apt-get update && apt-get install -y tzdata locales python3-pip cron && apt-get clean all && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
locale-gen en_US.UTF-8 && \
pip3 install django requests

# 解决中文乱码问题
#RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

EXPOSE 8000
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

messagecenter.tar 这个是Django项目,已经打成tar包了。在dockerfile中,执行ADD命令时,会自动解压tar包

run.sh

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# 启动任务计划
/usr/sbin/cron

# 最后一行增加任务计划
sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab

# 启动django项目
cd /messagecenter/
python3 manage.py runserver 0.0.0.0:8000

在Django项目中,有一个python脚本,需要每分钟执行一次!

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu xenial-security universe
deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse

生成镜像

1
docker build -t messagecenter /opt/messagecenter

启动镜像

1
docker run -d -it -p 8000:8000 messagecenter

访问页面:

1
http://192.168.0.162:8000

就可以访问Django的默认页面了!

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用nginx反向代理后如何获取客户端ip

发表于 2020-09-23

一、nginx 反向代理

nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

nginx反向代理配置时,一般会添加下面的配置:

1
`proxy_set_header Host $host;``proxy_set_header X-Real-IP $remote_addr;``proxy_set_header REMOTE-HOST $remote_addr;``proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`

1. proxy_set_header X-real-ip $remote_addr;

这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的”X-Forwarded-For”,与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的”X-Forwarded-For”部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header X-Forwarded-For $http_x_forwarded_for时会发现,web服务器端使用request.getAttribute(“X-Forwarded-For”)获得的值是null。如果想要通过request.getAttribute(“X-Forwarded-For”)获得用户ip,就必须先使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

二、Java获取客户端真实IP地址

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.javapeixun.com.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

1
`public` `String getRemortIP(HttpServletRequest request) { ``  ``if` `(request.getHeader(``"x-forwarded-for"``) == ``null``) { ``    ``return` `request.getRemoteAddr(); ``  ``} ``  ``return` `request.getHeader(``"x-forwarded-for"``); ``}`

可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

1
`public` `String getIpAddr(HttpServletRequest request) { ``  ``String ip = request.getHeader(``"x-forwarded-for"``); ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getHeader(``"Proxy-Client-IP"``); ``  ``} ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getHeader(``"WL-Proxy-Client-IP"``); ``  ``} ``  ``if``(ip == ``null` `|| ip.length() == ``0` `|| ``"unknown"``.equalsIgnoreCase(ip)) { ``    ``ip = request.getRemoteAddr(); ``  ``} ``  ``return` `ip; ``}`

可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

mysql百万数据字符串匹配查询速度优化之覆盖索引法

发表于 2020-09-23

什么是“索引覆盖”?

简单来的说,就是让查询的字段(包括where子句中的字段),都是索引字段。索引覆盖的好处是什么?好处是极大的、极大的、极大的提高查询的效率!重要的说三遍!

特别说明:

  1. where条件中如果使用like关键词,即使字段是索引中的,也不构成索引覆盖。
  2. 单个字段的索引,对于搜索单个where条件有较好的效果。但索引覆盖需要使用多字列索引。

假设创建一个zaho_user表:

1
2
3
4
5
6
7
 CREATE TABLE `zaho_user` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`insert_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`u_name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
`u_sex` tinyint(4) NOT NULL DEFAULT '1' COMMENT '性别',
`u_desc` varchar(200) NOT NULL DEFAULT '' COMMENT '介绍'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '用户表';

这里我们创建一个索引:

1
alter table `zaho_user` add index (`u_name`,`insert_time`,`u_sex`);

那么,我们执行如下查询时,效率将会非常高:

1
select `u_name`,`insert_time` from `zaho_user` where `u_sex`=1

例子中的三个字段:u_name,insert_time,u_sex创建了一个多列索引,而SQL查询时形成了索引覆盖。 在百万数据量匹配查询时速度提升非常可观

网站速度优化

为什么网站访问很慢, 想优化可以参考以下方式, 优先级由高到低:

  1. 数据库位置优化 (优先采用内网访问而非外网)
  2. 硬盘优化 (优先固态硬盘)
  3. SQL语句优化
  4. 服务器硬件和外网带宽升级
  5. 应用代码优化
  6. 定期重启mysql 连接优化 (亲测效果明显)

网站维护记录

本人有一个博客采集站, 内置文章3万左右, 访问和渲染速度非常快, 后来爬取文章增量到6万左右, 感觉网站速度明显变慢, 起初以为是内容过多导致, 可是也才6万就这么慢了那百万数据岂不没法玩了

我甚至在想 可能是服务器配置以及博客程序有限导致的 也没再管它

直到有一天 数据库容器挂了 , 重启数据库后, 网站恢复访问, 速度竟惊人地变快, 和最开始没两样, 于是乎我否断了之前的猜测, 之前速度慢有可能仅仅是数据库连接过多 垃圾缓存导致的

因此 定期重启数据库 似乎可以纳入我的定时任务计划中

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker部署redis

发表于 2020-09-18

部署Redis

  1. 搜索redis镜像
1
docker search redis
  1. 拉取redis镜像
1
docker pull redis
  1. 创建容器 设置端口映射
1
docker run -id --name=c_redis -p 6379:6379 redis:5.0

使用外部机器连接redis

1
.redis-cli.exe -h 192.168.149.135 -p 6379

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker部署nginx

发表于 2020-09-18

部署nginx

  1. 搜索nginx镜像
1
docker search nginx
  1. 拉取nginx镜像
1
docker pull nginx
  1. 创建容器 设置端口映射
1
2
3
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
  1. 创建nginx配置文件 否则下一步会报错
1
2
3
mkdir conf
cd conf
touch nginx.conf
  1. 在nginx.conf配置文件中添加以下配置信息(如果配置信息不对会导致无法正常启动)
1
2
3
4
5
6
7
8
9
10
11
12
worker_processes  1;
events {
worker_connections 1024;
}
http{
server{
listen 80;
server_name your_server_name; #erverName
root /usr/share/nginx/html;
index index.html;
}
}
  1. 创建并运行容器
1
2
3
4
5
6
7
8
docker run -id \
-p 80:80 \
--name=c_nginx \
-h c_nginx \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx:latest
  • 参数说明
    • -p 80:80 将容器的80端口映射到主机的80端口
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
      -v $PWD/logs:/var/log/nginx
      -v $PWD/html:/usr/share/nginx/html \ 将主机中当前目录挂载到容器
    • -h 设置容器的hostname
    • $PWD表示当前所在目录
    • –name:表示容器别名, 但凡是两个杠都需要带=

关于配置文件的修改

配置文件一旦修改需要重启nginx才生效, 重启前建议提前测试一下配置文件语法是否存在问题, 可以进入容器中, 执行以下指令进行测试:

1
nginx -t

image-20220920144752833

除了借助docker重启容器外, 还可以在容器内部直接执行nginx指令实现重载:

1
nginx -s reload

附带配置文件内容参考

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
#主模块指令,指定Nginx Worker进程运行用户以及用户组
user nginx;
#主模块指令,指定Nginx要开启的进程数,建议设置成和cpu的数量相等
worker_processes 1;
#主模块指令,定义全局错误日志文件;日志级别:debug、info、notice、warn、error、crit
error_log /var/log/nginx/error.log warn;
#主模块指令,指定进程pid的存储文件位置
pid /var/run/nginx.pid;
#事件指令,设定Nginx的工作模式及连接数上限
events {
#指定Nginx的工作模式;Nginx工作模式:select、poll、kqueue、epoll、rtsig和/dev/poll
use epoll; #epoll工作模式是首选
#定义Nginx每个进程的最大连接数,默认是1024
worker_connections 1024;
}
#HTTP服务器配置
http {
#主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
include mime.types;
#HTTP核心模块指令,默认类型为二进制流
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 /var/log/nginx/access.log main;
#指定Nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,必须设为on,
#注:如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#防止网络阻塞
#tcp_nopush on;
#连接超时时间
keepalive_timeout 65;

一、Web服务器
------------------------------------------------------------------------------------------------
#server虚拟主机配置
server {
#监听端口号
listen 80;
#域名:可有多个,支持种类:通配符名称、正则表达式名称、IP、localhost、其他(_、@)
server_name *.example.org;
~^(www\.)?(.+)$;
101.200.149.141;
...
localhost;
_;
#location URL匹配配置
#配置根目录转发到本机目录位置
location / {
root /usr/share/nginx/project_1/dist;
index index.html index.htm; # 主页现寻找index.html,如果没有index.html,再寻找index.htm
}

error_page 404 /404.html;

location = /40x.html {
}
error_page 500 502 503 504 /50x.html;

location = /50x.html {
}
}

二、反向代理(配置SSL证书,http转发到https)
------------------------------------------------------------------------------------------------
#web-http
server {
listen 80;
server_name www.xxxxxx.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;#将80端口的访问转发到443端口
}
#web-https
server {
listen 443 ssl;
server_name www.xxxxxx.com;
#ssl on; #需要注释,命令过时(1.15.0版本以后)
#配置证书的路径
ssl_certificate cert/2547204_www.xxxxxx.com.pem; #使用相对路线,放在nginx目录下,绝对路径报错
ssl_certificate_key cert/2547204_www.xxxxxx.com.key;
#ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;

#配置根目录转发到相应端口(例,82端口)使用单机服务
location / {
proxy_pass http://172.241.27.9:82; #nginx and tomcat 在同一台机器,使用http链接
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}

error_page 404 /404.html;

location = /40x.html {

}
error_page 500 502 503 504 /50x.html;

location = /50x.html {

}
}

三、负载均衡
------------------------------------------------------------------------------------------------
#设定负载均衡的服务器列表
#1.轮询(默认):
#每个请求按时间顺序逐一分配到不同的后端服务器,如果某台服务器宕机将被自动剔除,使用户访问不受影响
upstream myapp1 {
#i.down表示当前的server暂时不参与负载均衡;
server 192.168.8.1:28 down;
#ii.backup:预留的备份机器。
server 192.168.8.2:80 backup;
server 192.168.8.3:80;
}
#2.Weight权重:
#指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下
upstream myapp2 {
server 192.168.8.1:28 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
#3.ip_hash:
#每个请求按访问IP的hash结果分配,自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
upstream myapp3 {
ip_hash;
server 192.168.8.1:28;
server 192.168.8.2:80;
#iii.max_fails允许请求失败的次数,默认1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
#iv.fail_timeout在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
server 192.168.8.3:80 max_fails=6 fail_timeout=20s;
server 192.168.8.4:80;
}
#4.fair:更加智能的负载均衡算法。依据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
# 注:Nginx本身是不支持fair,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
#5.url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
# 注:Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash软件包。

server {
listen 80;
server_name www.hanxiaozhang.xyz;
location / {
proxy_pass http://myapp1;
}
}

}

注意事项

如果对Nginx配置文件进行了修改操作, 需要重启Nginx容器才能生效

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker部署wordpress

发表于 2020-09-18

部署wordpress

  1. 搜索wordpress镜像
1
docker search wordpress
  1. 拉取wordpress镜像
1
docker pull wordpress
  1. 使用Nginx进行反向代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http{
upstream wordpress_sex{
server 119.33.15.174:7778;
}
server{
listen 80;
server_name sex.newban.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://wordpress_sex;
break;
}
}

}
  1. 创建并运行容器
1
2
3
4
5
6
7
8
9
10
docker run -id \
--name=wordpress_sex \
-p 7778:80 \
-h wordpress_sex \
-v /root/songjian/wordpress/sex_www:/var/www/html \
-e WORDPRESS_DB_HOST=119.33.15.174:3306 \
-e WORDPRESS_DB_USESR=root \
-e WORDPRESS_DB_PASSWORD=songjian \
-e WORDPRESS_DB_NAME=wordpress_sex \
-d wordpress:latest

参数说明

  • WORDPRESS_DB_HOST 数据库主机地址(默认为与其 link 的 mysql 容器的 IP 和 3306 端口:)

  • WORDPRESS_DB_USER 数据库用户名(默认为 root)

  • WORDPRESS_DB_PASSWORD 数据库密码(默认为与其 link 的 mysql 容器提供的 MYSQL_ROOT_PASSWORD 变量的值)

  • WORDPRESS_DB_NAME 数据库名(默认为 wordpress)

  • WORDPRESS_TABLE_PREFIX 数据库表名前缀(默认为空,您可以从该变量覆盖 wp-config.php 中的配置)

    如果 WORDPRESS_DB_NAME 变量指定的数据库不存在时,那么 wordpress容器在启动时就会自动尝试创建该数据库,

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker部署springboot项目

发表于 2020-09-18

部署springboot项目

  1. 搜索java镜像
1
docker search java
  1. 拉取java镜像
1
docker pull java
  1. 创建容器 设置端口映射
1
2
3
4
5
6
docker run -id \
-p 8080:8080 \
--name=c_java \
-h c_java \
-v /root/springboot:/root/springboot \
java:latest
  • 参数说明
    • -p 8080:8080 将容器的8080端口映射到主机的8080端口
    • *-v /root/springboot:/root/springboot \将主机中当前目录挂载到容器springboot *
    • -h 设置容器的hostname
    • $PWD表示当前所在目录
  1. 运行项目

将springboot项目jar包传至 /root/springboot目录下,进入刚刚创建的java容器中,

1
docker exec -it c_java bash

然后使用java -jar指令运行项目

1
java -jar spring-demo.jar
  1. 浏览器访问
1
http://服务器ip:8080

小提示

如果你是使用的阿里云ECS 测试java和mysql的时候可能会无法访问, 这是因为 阿里云ECS处于安全考虑,默认的安全组规则只开通了22和3389号端口,而我们在实际使用当中可能会需要80、8888、21等端口号,这时只要去阿里云管理后台进行安全组设置新增开放端口号即可

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker部署tomcat

发表于 2020-09-18

部署Tomcat

  1. 搜索tomcat镜像
1
docker search tomcat
  1. 拉取tomcat镜像
1
docker pull tomcat
  1. 创建容器 设置端口映射
1
2
3
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
1
2
3
4
5
docker run -id \
-p 8080:8080 \
--name=c_tomcat \
-v $PWD:/usr/local/tomcat/webapps \
tomcat:latest
  • 参数说明
    • -p 8080:8080 将容器的8080端口映射到主机的8080端口
    • -v $PWD:/usr/local/tomcat/webapps 将主机中当前目录挂载到容器webapps
    • -h 设置容器的hostname
    • $PWD表示当前所在目录

小提示

如果你是使用的阿里云ECS 测试tomcat和mysql的时候可能会无法访问, 这是因为 阿里云ECS处于安全考虑,默认的安全组规则只开通了22和3389号端口,而我们在实际使用当中可能会需要80、8888、21等端口号,这时只要去阿里云管理后台进行安全组设置新增开放端口号即可

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用docker安装mysql

发表于 2020-09-18

部署MySql

  1. 搜索mysql镜像
1
docker search mysql
  1. 拉取mysql镜像
1
docker pull mysql
  1. 在/root目录下创建mysql目录用于存储mysql数据信息
1
2
mkdir ~/mysql
cd ~/mysql
  1. 创建容器 设置端口映射
1
2
3
4
5
6
7
8
9
docker run -id \
-p 3306:3306 \
--name=c_mysql \
-h c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=12345 \
mysql:latest
  • 参数说明
    • -p 3306:3306将容器的3306端口映射到主机的3306端口
    • -v $PWD/conf:/etc/mysql/conf.d 将容器中配置文件目录与主机挂载
    • -h 设置容器的hostname
    • $PWD表示当前所在目录

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…363738…50

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

493 日志
143 标签
RSS
© 2025 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%