(转)Nginx代理proxy pass配置去除location路径前缀

我们在使用Nginx做代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。

比如,访问abc.com/appv2/a/b.html, 要求转发到localhost:8088/appv2/a/b.html

简单配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream one {
server localhost:8088 weight=5;
}

server {
listen 80;
server_name abc.com;
access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main;

location / {
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_set_header X-NginX-Proxy true;

proxy_pass http://one;
}
}

即,设置proxy_pass即可。请求只会替换域名。

但很多时候,我们需要根据url的前缀转发到不同的服务。

比如
abc.com/user/profile.html转发到 用户服务localhost:8089/profile.html

abc.com/order/details.html转发到 订单服务 localhost:8090/details.html

即,url的前缀对下游的服务是不需要的,除非下游服务添加context-path, 但很多时候我们并不喜欢加这个。如果Nginx转发的时候,把这个前缀去掉就好了。

  • 一个种方案是proxy_pass后面加根路径 /
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    server {
    listen 80;
    server_name abc.com;
    access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main;

    location ^~/user/ {
    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_set_header X-NginX-Proxy true;

    proxy_pass http://user/;
    }

    location ^~/order/ {
    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_set_header X-NginX-Proxy true;

    proxy_pass http://order/;
    }

    }

^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/user/* 后面的路径直接拼接到后面,即移除user.

  • 另一种方案是使用rewrite
    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
    upstream user {
    server localhost:8089 weight=5;
    }
    upstream order {
    server localhost:8090 weight=5;
    }


    server {
    listen 80;
    server_name abc.com;
    access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main;

    location ^~/user/ {
    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_set_header X-NginX-Proxy true;

    rewrite ^/user/(.*)$ /$1 break;
    proxy_pass http://user;
    }

    location ^~/order/ {
    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_set_header X-NginX-Proxy true;

    rewrite ^/order/(.*)$ /$1 break;
    proxy_pass http://order;
    }

    }

注意到proxy_pass结尾没有/, rewrite重写了url。

对于文件映射也可以使用这两种方式,如下:

1
2
3
4
5
location ^~ /dafile {  
#rewrite ^/dafile/(.*)$ /$1 last;
proxy_pass http://172.31.8.168:8141/;//文件服务器nginx路径
#return 7;
}

参考资料

如何给没有连接互联网的centos使用yum安装其他软件

在工作中,在生产中经常会遇到这样的情况,服务器部署环境无法链接互联网,只能在内网运行。这时候如果使用Centos系统,就会发现安装软件是一件很痛苦的事情,不知道如何下手,因为如果有外网环境的话,在Centos下安装软件和开发工具是意见很麻烦的事情,因为linux上通过yum安装软件的时候是需要把相关的依赖也会安装的,所以如果只copy一个rpm包到服务器上安装是无法完成安装的。

下面介绍一种可以在无网环境的Linux下安装软件和开发工具的方法。

首先准备一台跟目标服务器操作系统、环境一样的机器,例如:

1
2
机器A. 192.168.10.12 有外网访问权限
机器B. 192.168.10.13 无外网访问权限

我们的目标就是在机器B上安装我们需要的软件。

原理:

借助yum安装的“缓存”,在有网的机器上打开yum的keepcache开关,把下载的软件和相应的依赖缓存起来,然后copy缓存到目标机器上,在目标机器上正常通过yum进行安装。

  • 1.需要在一台可以连外网的机子上安装一个同版本的centos的虚拟机。可能不同的版本包含了不同的基层依赖包,这样有可能会导致后续的安装失败。
  • 2.修改两台机器上的yum配置文件 /etc/yum.conf ,将 keepcache=0 修改成 keepcache=1, 打开缓存开关。因为yum在安装的时候会先去缓存查找,如果没有查找成功则会去网络下载。
    1. 在机器A上使用yum命令安装需要的软件。比如 sudo yum install -y yum-utils, 这个时候yum-utils的安装缓存就会保存起来。 在目录 /var/cache/yum/ 下可以看到,一般来说是个 x86_64的文件夹。
    1. Copy机器A上 /var/cache/yum/的目录文件到机器B上的相应目录。
  • 5.在机器B上执行 yum install -y yum-utils,完成软件的安装。

至此,就可以在无网的linux服务器完成软件的安装了。

注意,如果在有网的机器上添加了相应的repo的话,例如docker-ce.repo,在目标机器上也要添加相应的repo文件。

Mac电脑开启root账号,以及配置免密登录

最近在研究大数据分布式计算环境的配置,用到了Spark环境的配置,其中涉及到需要开启root账号和免密登录,

一、如何在 Mac 上启用 root 用户或更改 root 密码

完成某些任务需要系统更多区域的访问权限,Mac 管理员可以使用 root 用户帐户来完成这些任务。

名为“root”的用户帐户是一个超级用户,拥有更多系统区域(包括 macOS 用户帐户中的文件)的读写权限。默认情况下,root 用户处于停用状态。如果您可以使用管理员帐户登录 Mac,您可以启用 root 用户,然后以 root 用户身份登录来完成您的任务。

与启用 root 用户相比,在“终端”中使用 sudo 命令更为安全。要了解 sudo,请打开“终端”应用,然后输入 man sudo。

启用或停用 root 用户
  1. 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”)。
  2. 点按 锁形图标,然后输入管理员名称和密码。
  3. 点按“登录选项”。
  4. 点按“加入”(或“编辑”)。
  5. 点按“打开目录实用工具”。
  6. 点按“目录实用工具”窗口中的 锁形图标,然后输入管理员名称和密码。
  7. 从“目录实用工具”的菜单栏中:
    • 选取“编辑”>“启用 Root 用户”,然后输入要用于 root 用户的密码。
    • 或者选取“编辑”>“停用 Root 用户”。
以 root 用户身份登录

启用 root 用户后,仅在以 root 用户身份登录时,您才拥有 root 用户的权限。

  1. 选取苹果菜单 >“退出登录”,以退出登录您的当前用户帐户。
  2. 在登录窗口中,使用用户名“root”以及为 root 用户创建的密码登录。
    如果登录窗口显示用户列表,请点按“其他”,然后登录。

完成任务后,应务必停用 root 用户。

更改 root 密码
  1. 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”)。
  2. 点按 锁形图标,然后输入管理员名称和密码。
  3. 点按“登录选项”。
  4. 点按“加入”(或“编辑”)。
  5. 点按“打开目录实用工具”。
  6. 点按“目录实用工具”窗口中的 锁形图标,然后输入管理员名称和密码。
  7. 从“目录实用工具”的菜单栏中,选取“编辑”>“更改 Root 密码…”
  8. 在出现提示时输入 root 密码。

二、Mac terminal 允许root用户通过ssh登录

默认情况下,Mac 的 root 用户是没有开启的,当然更不可能通过 ssh 登录了

开启 root 用户

见上步。

配置 sshd 允许 root 用户登录(使用非root登录)
1
2
3
4
5
6
7
8
9
10
11
# 1. 先进入 root 用户模式
su

# 2. 然后编辑 sshd_config 文件内容
vi /private/etc/ssh/sshd_config

# 3. 找到 ‘#PermitRootLogin prohibit-password’ 这一行,把前面的 # 号去掉,并把后面改成 yes
PermitRootLogin yes

# 4. 保存并退出
:wq!
重启 sshd 服务
1
2
launchctl stop com.openssh.sshd     # 停止 ssh 服务
launchctl start com.openssh.sshd # 启动 ssh 服务

三、mac 免密ssh登陆配置不坑指南

我们把本地机子叫做为mac,远程机子叫做ubuntu(这个ubuntu也可以是centos,debian,mac之类的)。

  1. 生成公私钥对

    1
    2
    3
    ssh-keygen -t rsa -f local_rsa -C "local"

    根据交互,输入密码,或者直接回车可以为空,生成公私钥对
  2. 把共钥复制到服务器上

    1
    ssh-copy-id -i [公钥文件] user@host
  3. 一般别的系统到第三步就可以免密登陆了,但是mac并不这样。还要调用ssh-add。

    1
    2
    ssh-add -K [你的私钥文件,就是那个不加.pub结尾的文件]
    // 例如ssh-add -K id_rsa

注意上面的shell命令都在~/.ssh目录下,中途请不要切换目录。

参考资料

Spark学习笔记

搭建spark集群环境

  • 目 标:

搭建Spark集群环境,一台做为master(192.168.1.195),2台做为slave(192.168.1.122,192.168.1.195)

  • 需要准备环境并且已经完成环境变量设置:
    1
    2
    jdk 1.8
    scala scala-2.12.5
1. 修改hostname和hosts文件
  • 修改hostname
    在这两台机器上修改hostname,centos直接修改
    1
    2
    3
    #vim /etc/hostname

    m0.unicom

mac电脑参照Mac OS X 中 hostname 的设置

  • 修改hosts文件
    1
    2
    3
    4
    5
    #vim /etc/hosts

    192.168.1.195 m0.unicom # 主节点
    192.168.1.195 s0.unicom # slave节点
    192.168.1.122 s1.unicom # slave节点
2. 配置免密登录

配置ssh就是为了能够实现免密登录,这样方便远程管理Hadoop并无需登录密码在Hadoop集群上共享文件资源,并且可以方便spark能方便的管理worker slave。

可以参照我的这篇文章 Mac电脑开启root账号,以及配置免密登录

3 下载安装hadoop

在master节点安装hadoop,配置环境变量

1
2
3
export HADOOP_HOME=/Users/daren/devtool/hadoop-3.0.0
export HADOOP_HOME_WARN_SUPPRESS=1
export PATH=$PATH:$HADOOP_HOME/bin

3.1 配置hdfs地址和端口
进入hadoop目录/Users/daren/devtool/hadoop-3.0.0/etc/hadoop,修改core-site.xml内容为

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
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/Users/daren/devtool/hadoop-3.0.0/hadoop_data/temp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://m0.unicom:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>

<property>
<name>fs.hdfs.impl.disable.cache</name>
<value>true</value>
</property>

<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>

</configuration>

3.2 修改mapred-site.xml 内容为

1
2
3
4
5
6
7
8
9
10
11
12

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.hosts.exclude</name>
<value>/usr/unidata/hadoop/etc/hadoop/excludes</value>
<final>true</final>
</property>
</configuration>

3.3 修改hdfs-site.xml为如下:

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

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value> <!--关闭防火墙-->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///Users/daren/devtool/hadoop-3.0.0/hadoop_data/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///Users/daren/devtool/hadoop-3.0.0/hadoop_data/data</value>
</property>
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
<description>Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description>
</property>

<property>
<name>dfs.http.address</name>
<value>m0.unicom:50070</value>
<description>Secondary get fsimage and edits via dfs.http.address</description>
</property>

<property>
<name>dfs.namenode.secondary.http-address</name>
<value>m0.unicom:50090</value>
</property>

<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:/usr/unidata/hadoop/tmp/namesecondary</value>
<description>Determines where on the local filesystem the DFS secondary
name node should store the temporary images to merge.
If this is a comma-delimited list of directories then the image is
replicated in all of the directories for redundancy.
</description>
</property>

<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:/usr/unidata/hadoop/tmp/namesecondary</value>
<description>Determines where on the local filesystem the DFS secondary
name node should store the temporary edits to merge.
If this is a comma-delimited list of directories then the edits is
replicated in all of the directories for redundancy.
Default value is same as dfs.namenode.checkpoint.dir
</description>
</property>

<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description>The number of seconds between two periodic checkpoints.
</description>
</property>

<property>
<name>dfs.hosts.exclude</name>
<value>/usr/unidata/hadoop/etc/hadoop/excludes</value>
</property>
</configuration>

3.4 格式化HDFS

这个操作相当于一个文件系统的初始化,执行命令hdfs namenode -format

3.5 启动关闭Hadoop服务

1
2
./start-dfs.sh          
./stop-dfs.sh

3.6 验证hadoop是否启动成功

4 下载安装Spark

去官网下载相应版本的spark,注意scala版本
下载地址 https://spark.apache.org/downloads.html
4.1 配置环境变量

1
2
3
4
5
6
#创建软连接
ln -s /Users/daren/devtool/spark-2.4.4-bin-hadoop2.7 spark

#设置环境变量
export SPARK_HOME=/Users/daren/devtool/spark
export PATH=$PATH:$SPARK_HOME/bin

4.2 配置spark-env.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/Users/daren/devtool/hadoop-3.0.0/lib/native

export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://localhost:9000/history"
#export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=m0.unidata:2181,m1.unidata:2181,s0.unidata:2181,s1.unidata:2181,s2.unidata:2181 -Dspark.deploy.zookeeper.dir=/spark"
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home
export SCALA_HOME=/Users/daren/devtool/scala
export SPARK_MASTER_IP=s0.unicom
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=2
export SPARK_WORKER_MEMORY=4g
export HADOOP_CONF_DIR=/Users/daren/devtool/hadoop-3.0.0/etc/hadoop
export SPARK_CLASSPATH=$SPARK_CLASSPATH
#export SPARK_EXECUTOR_MEMORY=1G
#export SPARK_DRIVER_MEMORY=2G

4.3 配置slaves

1
2
s0.unicom
#s1.unicom

4.4 启动spark

1
./start-all.sh

在浏览器查看spark工作 http://192.168.1.195:8080/

遇到的坑

  • 问题1: Spark集群,通过master节点执行start-all.sh启动slave报错
    如下错误
    1
    2
    3
    4
    starting org.apache.spark.deploy.master.Master, logging to /Users/daren/devtool/spark/logs/spark-daren-org.apache.spark.deploy.master.Master-1-m0.unicom.out
    s1.unicom: bash: 第 0 行:cd: /Users/daren/devtool/spark: 没有那个文件或目录
    s1.unicom: bash: /Users/daren/devtool/spark/sbin/start-slave.sh: 没有那个文件或目录
    s0.unicom: starting org.apache.spark.deploy.worker.Worker, logging to /Users/daren/devtool/spark/logs/spark-daren-org.apache.spark.deploy.worker.Worker-1-m0.unicom.out

主要原因是想在master节点上启动所有的节点,而spark集群中需要各个节点中的spark home 的路径和master上spark home节点的路径必须一样,这样在slave节点中就找不到相应的spark home路径,所以报错了。

关键点:路径找不到,是192.168.1.122报的。因为master机器只配了各slave的ip,并不知道他们的spark安装路径,所以我猜测master是按本机的路径去调,但可惜spark在另外两台的目录和master并不一样,因此就找不到指定的路径了。

解决方法两种,第一种是将所有slave机器的spark路径改成和master一致,便可解决,第二种是单独启动master和slave节点

我这里采用第二种方法:
启动master节点,进入master spark home路径下的sbin目录中,

1
./start-master.sh -h 192.168.3.207(master ip) --host 192.168.3.207(master ip)

启动slave节点,进入slave spark home路径下的sbin目录中,执行

1
./start-slave.sh spark://192.168.3.207(master ip):7077

  • 问题2: master节点用户非root用户,slave节点用root节点,如何解决免密登录问题

原因分析:在本地开发环境想要搭建spark集群,我本地电脑用的是mac电脑作为master节点,没开启root账号,用的是“daren”账号,而slave(s1.unicom)节点用的是root账号,在开启了免密登录之后使用start-all.sh启动spark集群的时候,显示一直无法登录,报权限失败,无法登录,发现是ssh登录的时候,使用的时候/etc/hosts中配置的地址就行登录的,如下:

1
2
3
192.168.1.195  m0.unicom
192.168.1.195 s0.unicom
192.168.1.122 s1.unicom

当通过

1
ssh s1.unicom

登录的时候,其实想当于

1
ssh daren@192.168.1.122

而对于slave节点来说,是不存在daren用户的,所以我们需要修改ssh登录使用的用户名,刚开始以为可以在spark-env中进行配置,最后发现修改ssh config就可以,如下:

1
2
3
4
5
vim ~/.ssh/config
Host s1.unicom
HostName 192.168.1.122
User root
IdentityFile ~/.ssh/122_rsa

这样我们在使用ssh s1.unicom登录的时候会修改为

1
ssh root@192.168.1.122

这样就满足了我们的需要。

知识点:

Spark中map和flatMap的区别详解
Spark笔记:RDD基本操作(上)
Spark笔记:RDD基本操作(下)

参考资料

Mac OS X 中 hostname 的设置

查看系统 hostname 设置
使用命令行工具 hostname 可以查看系统 hostname 设置:

1
$ hostname

它的值会按优先级依次取决于下列值:

  • hostname 命令设置的值
  • HostName 属性值
  • LocalHostName 属性值(通常系统都会设置此属性)
    关于 hostname 相关属性,scutil 命令手册(info scutil 或 man scutil)中有如下描述:
    1
    2
    3
    4
    5
    6
    ComputerName   The user-friendly name for the system.

    LocalHostName The local (Bonjour) host name.

    HostName The name associated with hostname(1) and
    gethostname(3).

设置 hostname
有三种方式设置 hostname:

  • System Preferences
  • 命令行工具 hostname
  • 命令行工具 scutil

System Preferences

设置方法:

1
System Preferences -> Sharing

在这里可以查看和设置 ComputerName 和 LocalHostName,但不能设置 HostName 的值。

对于普通用户通常使用这种方式就可以了,因为通常情况下都没有用 hostname 和 scutil 来设置,所以就会取 LocalHostName 的值。

命令行工具 hostname

设置当前系统的 hostname 为 MyMac:

1
$ hostname MyMac

注意:这种方式不能保持到重启后

根据 hostname 命令的手册(info hostname 或 man hostname),可以使用 scutil 命令来持久修改 hostname

命令行工具 scutil

查看各属性值:

1
2
3
4
5
6
$ sudo scutil --get ComputerName
Yanke's MBP
$ sudo scutil --get LocalHostName
Yankes-MBP
$ sudo scutil --get HostName
HostName: not set

设置 HostName 属性值:

1
scutil --set HostName MyMac

scutil 可以修改 ComputerName,LocalHostName 和 HostName 任意一个值。

参考资料

SSH无密码登录

ssh 公钥认证是ssh认证的方式之一。通过公钥认证可实现ssh免密码登陆,git的ssh方式也是通过公钥进行认证的。

在用户目录的home目录下,有一个.ssh的目录,和当前用户ssh配置认证相关的文件,几乎都在这个目录下。

ssh-keygen 可用来生成ssh公钥认证所需的公钥和私钥文件。

使用 ssh-keygen 时,请先进入到 ~/.ssh 目录,不存在的话,请先创建。

生成ssh公钥

使用 ssh-kengen 会在~/.ssh/目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是:

  • id_rsa
  • id_rsa.pub
    第一个是私钥文件,第二个是公钥文件。

生成ssh key的时候,可以通过 -f 选项指定生成文件的文件名,如下:

1
2
3
ssh-keygen -t rsa -f vultr_rsa -C "vultr服务器"

其中:vultr_rsa 是文件名 vultr服务器是备注和客户端标示

配置公钥到服务器

将公钥内容添加到服务器的~/.ssh/authorized_keys 文件中.

alias 实现命令快速登陆

做好配置之后,通过ssh可以直接登录了。对经常登录的服务器,可以将ssh登录命令的alias加到 ~/.bash_profile文件中。

1
alias to-ini='ssh root@11.1.1.1'

登录的时候:

1
to-ini

ssh-copy-id

ssh-copy-id 是一个小脚本,你可以用这个小脚本完成以上工作。这个脚本在linux系统上一般都有。

1
ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.x.xxx

参考资料

Centos下ftp客户端lftp的使用

安装

1
yum install lftp

使用语法

1
2
3
4
5
6
7
8
9
10
11
lftp -[fceup] user:passwd@host #passwd可选,此方式密码明文保存,history可查看

-f <file> #执行文件中的命令后退出

-c <cmd> #执行命令后退出

-e <cmd> #登录后后执行命令

-u <user>[,<pass>] #使用指定的用户名/口令进行验证

-p <port> #连接指定的端口,默认21

常用命令

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
cd
#切换FTP目录

lcd #切换本地目录

ls
#列出FTP目录文件

!ls
#列出本地目录文件

find
./ -name file
#查找文件

mv
#移动

rm
#删除

mkdir
#新建目录

rmdir
#删除目录

上传下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
get [cEaO] file
-o newfilename #下载文件

put [cEaO] file
-o newfilename #上传文件

pget -n #多线程下载

可选参数:

-c #支持断点续传

-E #下载后删除远端文件

-a #指定传输为ascii模式, 默认为二进制模式

-O #指定存放目录

上传下载目录

1
2
3
4
5
6
7
8
9
10
11
12

mirror [cRnr] remote [local]

可选参数:

-c #支持断点续传

-R #上传整个目录

-n #只下载较新的档案,可用于增量备份

-r #只下载当前目录,不递归目录

主动/被动模式

1
2
3
4
5
6
#默认为被动模式

set
ftp:passive-mode no #关闭被动模式转为主动模式

#主动客户端开启数据传输端口,被动服务端开启数据传输端口。

妙用lftp多线程下载

1
lftp -c "pget -n 10 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz"

使用例子

1
2
lftp -u username,password -p 21 -e "mirror --only-newer --delete lydj /data/file/;quit;" ftpadmin@ip
从文件服务器lydj目录中递归下载文件到本地/data/file目录中,并且只下载最新的,对于服务器不存在的问题在本地也删除。

参考资料

Nginx 增加SSL认证之后,request.getScheme()获取不到https的问题记录

Nginx+Tomcat 部署 request.getScheme获取不到Https问题

通过浏览器输入https://www.xxx.com,request.getScheme()获取到的确实http而不是https.
通过request.getRequestURL()拿到的也是http://www.xxx.com
分析原因,是因为用nginx+tomcat部署web服务,tomcat接受到的请求都是来自于nginx的http请求

1
2
3
4
5
request.getScheme()  //总是 http,而不是实际的http或https  
request.isSecure() //总是false(因为总是http)
request.getRemoteAddr() //总是 nginx 请求的 IP,而不是用户的IP
request.getRequestURL() //总是 nginx 请求的URL 而不是用户实际请求的 URL
response.sendRedirect( 相对url ) //总是重定向到 http 上 (因为认为当前是 http 请求)

解决办法:

查看更多

centos 7下iptables 的安装和使用

说明:Centos 7 默认的防火墙是 firewall ,鉴于 iptables 使用的比较广,本文简要介绍在 CentOS7.0 系统下 iptables 服务的安装以及相关的使用方法。

关闭 firewall

为了防止与 iptables 服务冲突,先禁用 firewall 开机启动使用systemctl status firewalld
查看服务状态,active/inactive表明服务是运行/关闭状态(如下图)

  • 查看firewalld状态

    1
    systemctl status firewalld
  • 关闭fiewwalld

    1
    systemctl stop firewalld
  • 禁止开机启动

    1
    systemctl disable firewalld

安装 iptables

查看更多