利用SSH上传、下载(使用sz与rz命令)

简述

通常,利用SSH管理远程Linux服务器时,经常需要与本地交互文件。当然,我们可以利用FTP方式,比如通过Filezilla客户端软件。不过直接使用SSH软件(SecureCRT、Xshell)自带的上传和下载功能无疑使最方便快捷的。通常SSH软件支持的文件传输协议主要有ASCII、Xmodem、Zmodem等。

rz,sz是便是linux/Unix同Windows进行ZModem文件传输的命令行工具。

1、使用前提

  • 首先,你的Linux端(CentOS, Ubuntu)需要安装rz/sz命令,也就是 lszrz 包。
  • 其次,windows端需要支持ZModem的telnet/ssh客户端(Xshell,SecureCRT支持,好像putty不支持),SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可)
  • 运行命令rz,即是接收文件,xshell就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到linux里的当前目录。如果要上传文件,直接用鼠标点住文件往X-shell里面一拖即是
  • 运行命令 sz file 就是发文件到windows上(保存的目录是可以配置) 比ftp命令方便多了,而且服务器不用再开FTP服务了

2、文件传输协议

文件传输是数据交换的主要形式。在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常见的传输协议有以下几种:

  • ASCII:这是最快的传输协议,但只能传送文本文件。
  • Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。
  • Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快
  • Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。

3、在Linux上安装lrzsz

单单是SSH客户端软件支持以上文件传输协议(ASCII,Xmodem,Ymodem,Zmodem)还不行,我们的Linux服务器上也得安装相应的软件,以支持这些文件传输协议才行。在Linux上,lrzsz就是完成此任务的,lrzsz就是一个支持Zmodem 传输协议的工具。我们通过sz/rz两个命令,分别发送/接收文件。如果我们的系统中没有安装lrzsz这个包,就会报错,安装即可解决。

[root@localhost ~]# rz
-bash: rz: command not found
## For CentOS/RHEL
[root@localhost ~]# yum -y install lrzsz
## For Ubuntu
# sudo apt-get install lrzsz

4、理解记忆

其中,对于sz和rz的理解与记忆我用了如下的方法(很多时候容易搞混):

  • sz中的s意为send(发送),告诉客户端,我(服务器)要发送文件 send to cilent,就等同于客户端在下载。
  • rz中的r意为received(接收),告诉客户端,我(服务器)要接收文件 received by cilent,就等同于客户端在上传。

记住一点,不论是send还是received,动作都是在服务器上发起的。我们习惯了说上传或是下载,其实大可不必。使用这两个命令,只要思考一点,是要把文件从服务器上发送出去,还是从客户端接收回来,就可以了。

好吧,最后总结为一句话:

我(客户端)上传,你(服务器)接收(RZ),我下载(客户端),你(服务器)发送(SZ)。

5、简单用法

  • sz用法:发送出去
### 下载一个文件: 
# sz filename 
### 下载多个文件: 
# sz filename1 filename2
### 下载dir目录下的所有文件,不包含dir下的文件夹: 
# sz dir/*
  • rz用法:接收回来
### 直接键入rz命令即可
# rz
### 直接拖动文件到 xshell, 或者 SecureCRT 窗口即可
输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。

6、设置默认路径

SecureCRT:

设置上传和下载的默认目录:

  • 英文版: options — session options — X/Y/Zmodem。

  • 中文版: 选项— 会话选项— X/Y/Zmodem。

未分类

未分类

Xshell:

设置上传和下载的默认目录:

File -> Properties -> ZMODEM

未分类

未分类

7、操作演示

(仅演示Xshell,其他类似)

rz命令(下载)

当我们键入rz命令之后,会弹出文件选择对话框,选择需要传输的文件,点击 Add 即可。

接收的目录就是我们当前执行rz命令的目录。

未分类

今天又发现一个更简单直接的方法,直接选中文件,用鼠标点住文件往Xshell里面一拖就可以了。

sz命令(上传)

假设我要发送文件,直接使用sz命令, 其后接上文件名即可。同理,敲下回车后,也会弹出对话框,让我们选择接收的文件夹。

[root@localhost ~]# sz nagios-4.0.7.tar.gz  nagios-plugins-2.0.3.tar.gz

8、问题

xshell或者SecureCRT 启动 tmux或screen之后,sz, rz 命令都无法弹出正常的文件选择窗口,该如何解决?

看起来 tmux 下不支持 zmodem,所以这两个命令也用不了。

使用sed或awk获取除最后两个字段之外的字段

字符串示例为:

/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/ufs-client-2.0.0.jar

需求:如果使用斜杠/作为分隔符的话,可能每个字符串的字段数不同,这时需要取 除了最后两个字段外的其他字段字符串,所得结果应为如下形式:

/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

解决方法:

1、使用sed

[root@www ~]# b="/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar"
[root@www ~]# a=`echo "/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar" |awk -F'/' '{print $(NF-1)"/"$NF}'`
[root@www ~]# echo $b|sed -n "s#$a##gp"
/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

2、使用awk

[root@www ~]# b="/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar"
[root@www ~]# echo $b |awk -F'/' '{gsub($(NF-1)"/"$NF,"");print}'
/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

同一机器配置多个git密钥连接多个仓库

问题阐述

当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git。这两者你的邮箱如果不同的话,就会涉及到一个问题,生成第二个git的key的时候会覆盖第一个的key,导致必然有一个用不了。

问题解决

我们可以在~/.ssh目录下新建一个config文件配置一下,就可以解决问题

具体步骤

  • 生成第一个ssh key(这里我用于github,用的gmail邮箱)
ssh-keygen -t rsa -C "[email protected]"

这里不要一路回传,让你选择在哪里选择存放key的时候写个名字,比如 id_rsa_github,之后的两个可以回车。

完成之后我们可以看到~/.ssh目录下多了两个文件

未分类

  • 生成第二个ssh key(这里我用于gitlab,用的是公司邮箱)
ssh-keygen -t rsa -C "[email protected]"

还是一样不要一路回车,在第一个对话的时候继续写个名字,比如 id_rsa_gitlab,之后的两个可以回车。

完成之后我们可以看到如2中图所标记,一样出现两个文件。(一个公钥一个私钥)

  • 打开ssh-agent

这里如果你用的github官方的bash,ssh-agent -s,如果是其他的,比如
msysgit,eval $(ssh-agent -s)

  • 添加私钥
ssh-add ~/.ssh/id_rsa_github
ssh-add ~/.ssh/id_rsa_gitlab
  • 创建并修改config文件

在windows下新建一个txt文本,然后将名字后缀一起改成config即可
在bash下的话直接touch config 即可。
添加一下内容

# gitlab
Host git.iboxpay.com
    HostName git.iboxpay.com  //这里填你们公司的git网址即可
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_gitlab
    User zhangjun

# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github
    User ZJsnowman
  • 在github和gitlab上添加公钥即可,这里不再多说。

  • 测试

未分类

PS:如果到这里你没有成功的话,别急,教你解决问题的终极办法–debug

比如测试github,ssh -vT [email protected]

-v 是输出编译信息,然后根据编译信息自己去解决问题吧。就我自己来说一般是config里的host那块写错了。

补充一下

如果之前有设置全局用户名和邮箱的话,需要unset一下

git config --global --unset user.name
git config --global --unset user.email

然后在不同的仓库下设置局部的用户名和邮箱

比如在公司的repository下git config user.name “yourname” git config user.email “youremail” 在自己的github的仓库在执行刚刚的命令一遍即可。

这样就可以在不同的仓库,已不同的账号登录。

配置putty或SecureCRT防止SSH连接中断

当用SSH协议连接Linux服务器时,有时几分钟内没有操作,连接就会中断,必须重新登陆。

本文提供解决方案供参考:

8以CentOS 6.4为例:

1、修改ssh配置文件

vi /etc/ssh/sshd_config

找到ClientAliveInterval,指定了服务器端向客户端发送请求消息的时间间隔, 默认是0,不发送。

将后面的数值设置修改,单位为秒,如10分钟,则可设置参数为600
再找到ClientAliveCountMax,指如果发现客户端没有响应,则判断为一次超时,这个参数设置允许超时的次数,比如10,则代表允许超时 6000秒 = 100分钟。

2、修改SecureCRT会话属性配置

未分类

3、Putty

启用putty keepalive

putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为60。

如下图所示

未分类

其他工具也可根据实际情况修改保活机制相关配置。

samba中实现共享中所有创建的文件都属于指定用户的功能

方法很简单,但很实用。

在需要指定的共享中加入。

force user = 要指定的用户

例如,要求老师得能在“孙锡源”这个学生的共享文件夹中创建文件,但老师创建的文件所有者是老师本人,孙锡源没权限修改及删除文件。那么就可以加一行“force user = sxy”,让老师创建的文件的所有者也是孙锡源本人,这样孙锡源就可以操作文件了。

未分类

使用rsync搭建centos的镜像站

简介

自己一直以来相搭建一个开源镜像站,一方面可以了解搭建镜像站的知识,一方面可以同步那些国内没有的linux发行版软件源,但是最主要的原因只是为了好玩

注意点

我这个教程不是专业教程,但是要注意的是镜像站是一个对I/O要求很高,网络带宽要求很高,磁盘占用量的站点,不然没人用

步骤

  • 安装需要的软件(nginx,rsync)
  • 配置nginx
  • 编写同步脚本

编译安装nginx

  • 安装PCRE库

下载解压

wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
tar -zxvf pcre-8.41.tar.gz
cd pcre-8.41

编译安装

./configure --prefix=/usr/local/pcre
make
make install
  • 安装zlib

下载解压

wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11

编译安装

./configure --prefix=/usr/local/zlib
make
make install
  • 安装openssl库
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar -zxvf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l

编译安装

./config --prefix=/usr/local/openssl
make
make install
  • 安装nginx

下载解压

wget http://mirrors.sohu.com/nginx/nginx-1.12.1.tar.gz
tar -zxvf nginx-1.12.1.tar.gz
cd nginx-1.12.1

编译安装

./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre/ --with-zlib=/usr/local/zlib/ --with-openssl=/usr/local/openssl/
make

报错

[root@bboysoul nginx-1.12.1]# make
make -f objs/Makefile
make[1]: Entering directory `/root/nginx-1.12.1'
cd /usr/local/pcre/ 
&& if [ -f Makefile ]; then make distclean; fi 
&& CC="cc" CFLAGS="-O2 -fomit-frame-pointer -pipe " 
./configure --disable-shared 
/bin/sh: line 2: ./configure: No such file or directory
make[1]: *** [/usr/local/pcre//Makefile] Error 127
make[1]: Leaving directory `/root/nginx-1.12.1'
make: *** [build] Error 2

百度了一下,原来–with-pcre要指定的不是安装目录而是源码目录

./configure --prefix=/usr/local/nginx --with-pcre=/root/pcre-8.41 --with-zlib=/usr/local/zlib/ --with-openssl=/usr/local/openssl/
make

又报错

src/http/modules/ngx_http_log_module.c:13:18: fatal error: zlib.h: No such file or directory
 #include <zlib.h>
                  ^
compilation terminated.
make[1]: *** [objs/src/http/modules/ngx_http_log_module.o] Error 1
make[1]: Leaving directory `/root/nginx-1.12.1'
make: *** [build] Error 2

直接指定zlib的源码目录好了

./configure --prefix=/usr/local/nginx --with-pcre=/root/pcre-8.41 --with-zlib=/root/zlib-1.2.11 --with-openssl=/usr/local/openssl/
make
make install

成功

  • 测试一下

如果你这个时候还是访问不了你的nginx,出现ERR_ADDRESS_UNREACHABLE这个错误,你要检查一下你的防火墙,可以配置也可以选择关闭

systemctl stop firewalld.service

其实到这一步的时候我已经忘记我在干什么了,看了一下标题,哦!原来我在做一个镜像站,,,,,

安装rsync

yum install rsync

配置

之后,配置一下站点

在home文件夹下创建一个站点文件来存放同步过来的资源

mkdir /home/mirror

之后修改nginx.conf的server段为

    server {
        listen       80;
        server_name  localhost;
        root    /home/mirror;
        location / {    
                autoindex on;
                autoindex_exact_size off;
                autoindex_localtime on;
        }

    }

重启一下服务器

[root@bboysoul sbin]# pidof nginx
31632 31631
[root@bboysoul sbin]# kill 31632 31631
[root@bboysoul sbin]# pidof nginx
[root@bboysoul sbin]# ./nginx
[root@bboysoul sbin]# 

接着你去访问站点,看到的就会是下面这样,因为打开了nginx的目录浏览功能autoindex

Index of /
../

安装createrepo

yum install createrepo

因为centos的软件包目录有点多,而且大,所以为了方便我就只同步epel软件源了

mkdir epel
cd epel
mkdir 7

之后编写一个同步脚本

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS/ /home/mirror/epel/7/SRPMS/
createrepo /home/mirror/epel/7/SRPMS/

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/aarch64/ /home/mirror/epel/7/aarch64/
createrepo /home/mirror/epel/7/aarch64/

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/ppc64/ /home/mirror/epel/7/ppc64/
createrepo /home/mirror/epel/7/ppc64/

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/ppc64le/ /home/mirror/epel/7/ppc64le/
createrepo /home/mirror/epel/7/ppc64le/

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/ /home/mirror/epel/7/x86_64/
createrepo /home/mirror/epel/7/x86_64/

echo "bboysoul done"

赋予执行权限

sudo chmod +x rsync.sh

安装screen

yum install screen

建立一个新的会话

screen -S rsync

执行脚本

./rsync.sh

ctrl+a+d退出

你可以安装bwm-ng来监控网速,我这边的状态是这样的

同步时间很久的,注意磁盘有没有被占满

同步时间肯定很久。

rsync工具远程数据同步备份

基本信息:

  • A:192.168.1.10 源服务器(源数据服务器)
  • B:192.168.1.20 目的服务器(备份存放服务器)

两台服务器系统均为CentOS

1、在A服务器配置rsync服务端

安装rsync

#yum install rsync

编辑配置文件

#vim /etc/rsyncd.conf
[global]
uid=nobody
gid=nobody
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
Timeout = 600
Log format = %t %a %m %f %b

[backup]
path=/tmp/data_bak
ignore errors
read only = yes
list = no
auth users = backupuser
secrets file = /etc/rsyncd/rsyncd.secrets
hosts allow = 192.168.1.20
hosts deny = 0.0.0.0/0

创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,不要和系统帐户重名,同时要把创建的密码文件权限设置为600,一行一个账号密码,账号与密码用:号隔开

#echo "back:abc123" > /etc/rsyncd.secrets
#chmod 600 /etc/rsyncd.secrets

设置备份数据目录权限为755

#chmod -R 755 /tmp/data_bak

开启防火墙并重启

#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
#service iptables save
#service iptables restart

启动rsyncd服务

#/usr/bin/rsync --daemon --config=/etc/rsyncd.conf

2、在B服务器配置rsync客户端

这里很简单,只要安装和配置连接密码即可

#yum install rsync
#echo "abc123" > /etc/rsyncd.secrets

执行备份命令

#rsync -vrtopg --password-file=/etc/rsyncd.secrets [email protected]::backup /home/data_bak

rsync 命令的选项含义参考:

http://man.linuxde.net/rsync

这里执行这个命令可能会报一些错误,解决办法如下:

  • 问题1:
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

原因:服务器端配置文件/etc/rsyncd.conf中use chroot = yes是否配置

  • 问题2:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

原因:
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。注意查看/etc/rsyncd.conf中的path是否配置正确。

  • 问题3:
rsync: opendir "data/2017-08-29" (in backup) failed: Permission denied (13)

原因:
注意查看服务器端同步的目录权限是否为755。

将备份命令加入任务计划

#crontab -e
* * */1 * * rsync -vrtopg --password-file=/etc/rsyncd.secrets [email protected]::backup /home/data_bak

CentOS7安装Certbot解决提示Python-urllib3安装失败

Certbot是一个部署Let’s Encrypt证书的客户端(Let’s Encrypt是一个证书发布机构CA,Let’s Encrypt支持域名加密,即为域名启用https)。

Certbot能够自动的在Web服务器(Apache,Nginx等)上部署从Let’s Encrypt获取的证书,非常简单易用。

Certbot提供了为特定系统和特定服务器安装Certbot的简便方法,使用Certbot提供的为CentOS7系统Apache服务器安装Certbot时,提示:

安装失败

python-urllib3.nonarch 0:1.10.2-2.el7_1

1、安装失败的原因:

那是因为在安装Python时,你已经在系统中安装了urllib3包,而且安装的版本高于1.10。

2、解决方法:

卸载已经安装的Python的urllib3包

pip uninstall urllib3

然后就能够成功安装python-urllib3软件包

3、运行certbot命令提示urllib3版本低

如果你成功安装了python-urllib3软件包,在运行certbot命令时提示urllib3版本太低,可以使用pip命令升级urllib3包:

pip install --upgrade urllib3

python升级后使用yum出现No module named yum错误处理

最近在看python,虚拟机装的是Centos6.6,自带的python版本是2.6.6,打算升级到2.7。

我的升级过程大致如下:

  • 下载2.7源码包https://www.python.org/downloads/source/
  • 卸载旧的python,rpm -e python
  • 编译安装python2.7

整个过程没有遇到问题,但升级完后,再用yum安装软件时报如下错误

[root@localhost python]# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.13 (r266:84292, Jan 22 2014, 09:37:14) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

yum不可用了,这下问题就大了,spacer.gif没有yum,安装rpm包特别费劲。

开始百度关键字“No module named yum”,出来很多帖子和博客,博客上边说的大概意思就是yum就基于python的,升级python后,yum与高版本的python不兼容,导致yum无法使用。博客上给出的方法都是修改/usr/bin/yum文件的头部,把/usr/bin/python修改为/usr/bin/python2.6就可以了,但我的情况是我把旧的python已经卸载了,于是又开始安装2.6版本的python。

安装好2.6.6版本的之后以为就好了,但是还是报有错误:

[root@localhost python]# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.6.6 (r266:84292, Jan 22 2014, 09:37:14) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

这就奇怪了,都已经把旧版本的装上了,还是不行。这时看到一篇博客是把python和yum都全部卸载后重新安装的。想想这也是个办法于是就又全部下载

whereis python |xargs rm -rf
rpm -e --nodeps python

卸载后重新安装,从光盘镜像里找到python和yum的包

rpm -ivh --nodeps python*
rpm -ivh --nodeps yum*

这次总该好了吧,验证一下

[root@localhost python]# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:37:14) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 23, in <module>
    import rpm
ImportError: No module named rpm

还是报错。。。

spacer.gif不过这次错误变了,变成了“No module named rpm”

再次百度,看到有人说是缺少包:rpm -ivh rpm-python-4.8.0-37.el6.i686.rpm

安装上面的包后一切yum恢复正常了。

那问题又来了难道因为yum就不升级python版本吗?当然不是。其实是我在安装新版python的时候把旧版本的也卸载了才导致这样的问题。

后来在不卸载2.6版本的python是,重新编译安装2.7版本,安装成功并且yum仍然可用。

openresty resty_lua_http模块unable to get local issuer certificate异常处理

最近刚换工作,新公司作为一资讯公司有为客户提供相关SDK去接入公司系统进行一些信息查询作业。随之请求流量的增加,缺少网关层进行API保护,系统常常会因为流量暴增时间段搞垮。自然而然,作为招入公司重构原有系统职责中的开发计划的第一步自然就是打算先做网关了。之前主要是做Java开发,对Openresty做涉及到相关技术见解都很肤浅(欢迎大家拍砖),对中间学习使用Openresty所遇到一些异常在这里做个小记 。(持续更新中…)

模块:Resty_Lua_Http

发起SSL请求异常: 20: unable to get local issuer certificate

示例:

local http = require("resty.http")

local httpc = http.new()

local resp, err = httpc:request_uri("https://m.taobao.com", {
    method = "GET",
    path = "/#index",
    headers = {
        ["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"
    },
})

if not resp then
    ngx.say("request error:", err)
    return
end

原因:nginx没有获得本地颁发者证书

解决方法:在nginx.conf http -> server 加入已安装OpenSSL根证书地址,见第(6,7行)

server {
    listen 8000;
    server_name _;
    resolver 8.8.8.8;
    --
    lua_ssl_verify_depth 2;
    lua_ssl_trusted_certificate /etc/ssl/certs/GlobalSign_Root_CA.pem;
    ---
    location /api {
        default_type "text/html";
        lua_code_cache off;
        content_by_lua_file /home/hf/IdeaProjects/apigateway/lua/http.lua;
    }
}