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

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


  • 首页

  • 归档

  • 搜索

使用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表示当前所在目录

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

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

Linux Crontab 命令安装和使用教程:在 VPS 上设置定时任务

发表于 2020-09-18

一、Crontab 命令安装教程

首先检查一下 Crontab 是否安装:

1
crontab -l

如果没报错,就是已经安装好了,一般来说系统都会自带。

如果没安装,进行安装:

CentOS:

1
2
yum install vixie-cron
yum install crontabs

Ubuntu:

1
apt-get install cron

二、Crontab 命令使用教程

命令格式:

1
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

是不是觉得怪复杂的,其实一般来说其实就三个命令:

  • 列出所有定时任务:crontab -l
  • 编辑所有定时任务:crontab -e
  • 删除所有定时任务:crontab -r

使用 crontab -l 可以列出所有的定时任务,一行一个任务,一般来说,每行的格式如下:

1
分 时 日 月 星期 要运行的命令
  • 第 1 列:分钟,取值范围:0~59
  • 第 2 列:小时,取值范围:0~23(0表示子夜)
  • 第 3 列:日,取值范围:1~31
  • 第 4 列:月,取值范围:1~12
  • 第 5 列:星期,取值范围:0~7(0 和 7 表示星期天)
  • 第 6 列:要运行的命令

对于每一列,有如下几种表示方法:

  • *:每单位(比如每分钟,每小时)
  • 具体数字:就是具体的时间或者日期
  • 取值范围:比如 3 – 5,就是从 3 到 5 的所有值都取
  • */数字:比如 */2,就是每 2 分钟或者每 2 天之类的意思

下面看几个例子:

实例 1:每 1 分钟执行一次 myCommand

1
* * * * * myCommand

实例 2:每小时的第 3 和第 15 分钟执行

1
3,15 * * * * myCommand

实例 3:在上午 8 点到 11 点的第 3 和第 15 分钟执行

1
3,15 8-11 * * * myCommand

实例 4:每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行

1
3,15 8-11 */2  *  * myCommand

实例 5:每周一上午 8 点到 11 点的第 3 和第 15 分钟执行

1
3,15 8-11 * * 1 myCommand

实例 6:每晚的 21:30 重启 smb

1
30 21 * * * /etc/init.d/smb restart

实例 7:每月 1、10、22 日的 4 : 45 重启 smb

1
45 4 1,10,22 * * /etc/init.d/smb restart

实例 8:每周六、周日的 1 : 10 重启 smb

1
10 1 * * 6,0 /etc/init.d/smb restart

实例 9:每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 smb

1
0,30 18-23 * * * /etc/init.d/smb restart

实例 10:每星期六的晚上 11 : 00 pm 重启 smb

1
0 23 * * 6 /etc/init.d/smb restart

实例 11:每一小时重启 smb

1
0 */1 * * * /etc/init.d/smb restart

实例 12:晚上 11 点到早上 7 点之间,每隔一小时重启 smb

1
0 23-7 * * * /etc/init.d/smb restart

实例 13:5小时后 每一小时重启 smb

1
0 5/1 * * * /etc/init.d/smb restart

错误示例:

如果你想定一个每天两点执行的任务:

1
0 2 * * * /etc/init.d/smb restart

但不能写成:

1
* 2 * * * /etc/init.d/smb restart

这种写法表示每天两点开始每分钟执行一次任务, 可能会陷入嵌套重复执行的问题

配置完后 最后启动定时任务

ubuntu下启动、停止与重启cron:

1
2
3
4
$sudo /etc/init.d/cron start
$sudo /etc/init.d/cron stop
$sudo /etc/init.d/cron restart
$sudo service cron status# 查看当前cron服务运行状态

定时任务备份

可以使用这种方法在$HOME目录中对crontab文件做一备份:

1
$ crontab -l > $HOME/mycron

问题排查

1. 启动cron 报错:

1
cron: can't lock /var/run/crond.pid, otherpid may be 4187: Resource temporarily unavailable

解决方案:

依次执行以下三个命令

删除pid 重新加载配置 重启启动cron

1
rm -rf /var/run/crond.pid
1
cron reload
1
cron restart

2.任务不执行 日志不打印

指令必须以绝对路径开头 比如:

1
* */2 * * *  /usr/bin/python3  /root/xxx/xxx.py >>/root/xxx/mylog_$(date +\%Y-\%m-\%d-\%H:\%M:\%S).log 2>&1

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

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

利用 IntelliJ IDEA 远程连接服务器并做ftp上传

发表于 2020-09-18

对于windows用户来说上传文件到服务器有很多资源可以利用,例如xshell,xftp等可视化进行服务器的管控,但是对于mac的小伙伴来说现在找一个替代xshell的不是很好找,要么不好用要么用起来比较繁琐.小编发现idea自带ssh连接,也可以通过idea进行文件管理上传至服务器.

打开idea可以单独设置一个空包作为服务器管理,只需要把要上传的文件放到包里面即可.

idea >> Tools >> Deployment >> Configuration 进入到配置页面

点击加号出现配置服务器信息.我们选择sftp文件上传模式,名称为为当前上产服务器设置的别名

录入必要信息:

  • SFTP host 服务器地址.

  • Port. 端口号

  • Root path 默认上传路径

  • User name 登录服务器用户名

  • Auth type 授权方式,这里小编采用密码授权模式

  • Password. 登录服务器密码

录入完必要信息以后可以点击Test SFTP connection进行连接测试

通过 Tools >> Start SSH 进行ssh远程连接,点击后会出现配置好的ssh信息,选择即可

链接成功后在idea的Terminal中可以看到链接成功的信息

通过Configuration 下选择配置好的ssh服务器进入Mappings文件夹 可以配置上传路径和本地文件存放路径

配置完以后 通过项目右键可以看到一个上传到服务器按钮点击即可把要上传的文件上传至服务器

上传后的效果.

至此通过idea远程链接ssh并上传文件至服务器配置完毕.需要的小伙伴们可以去使用啦

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

1…363738…50

乱码三千

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

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