月度归档:2016年02月

Let’s Encrypt自动续期脚本

在之前的文章中有对Let’s Encrypt进行介绍,这个开源项目提供的Free SSL Cert非常适合在小型站点上进行部署。部署过程稍微复杂但是十分可靠。

美中不足的是,Let’s Encrypt提供的SSL证书有效期仅为90天,也就是说,为了确保证书不过期,使用者尽量得在60天内就对证书有效期进行更新操作。

所谓的更新,最简单的方法就是重新生成,但重新生成证书会有两个问题:

  1. 生成证书时会占用80端口,也就是说在生成证书期间,网站将无法访问。
  2. 手动升级证书过程虽然简单,但能够自动化的操作最好还是机器执行比较容易。

看了许多国内的关于自动续期脚本的文章,大多是拿来主义,直接使用别人封装好的脚本。诚然这十分方便,但其实自己编写一个自动续期脚本也并不困难。在DO上有篇文章详细的说明了这个过程(文章链接),可供参考。这里放出我自己的版本。

自动更新命令配置

这里使用Let’s Encrypt自带的Webroot插件完成证书更新。使用这个插件的好处在于,它在执行更新操作的时候创建了一个虚拟的环境用于更新证书,这就避免了80端口的占用。于是乎,不关闭网站完成证书更新便成为了可能。

首先,需要将Webroot插件的工作目录加入到Nginx的server字段中,使得Let’s Encrypt的服务能够访问到这个目录以用来validate。

在”在Nginx上部署Let‘s Encrypt证书“一文中,有Nginx服务器配置,这里需要在443端口的server字段中加入下面几行:

location ~ /.well-known {
    allow all;
}

以上修改的文件为

/etc/nginx/sites-enabled/zivers.com

在我的Nginx配置文件中,网站root目录为

/var/www/zivers.com/

执行更新操作时,需要选定这个目录运行脚本。

下面执行更新操作

cd /usr/letsencrypt
./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/zivers.com -d zivers.com -d www.zivers.com

请将上述命令中的路径和域名改为自己的。

重载Nginx生效

service nginx reload

上述命令似乎有点复杂,下面我们将上面的命令配置化。首先复制Let’s Encrypt的样例cli文件

cp /usr/letsencrypt/examples/cli.ini /etc/letsencrypt/auto-renew.ini
vi auto-renew.ini

去除以下字段前的注释并对配置文件进行修改:

rsa-key-size = 4096
email = admin@zivers.com
domains = zivers.com, www.zivers.com
webroot-path = /var/www/zivers.com/

现在,你可以用配置化的命令执行更新操作

cd /usr/letsencrypt
./letsencrypt-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini

创建自动更新脚本

于是我们可以创建一个脚本来自动执行上述操作

cd /usr/shell/
vi letencrypt-auto-renew.sh

样例脚本如下:

#!/bin/bash
cd /usr/letsencrypt
./letsencrypt-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini
service nginx reload

赋予执行权限

chmod +x letencrypt-auto-renew.sh

加入crontab自动执行

crontab -e
0 0 1 * * /usr/shell/letsencrypt-auto-renew.sh

使用CONCAT语句批量执行MySQL插入操作

背景

批量插入是在MySQL操作中经常需要使用到的。使用CONCAT和GROUP_CONCAT语句将能够很大程度上提升工作效率,减少了对使用脚本完成任务的需求。通常情况下,直接使用SQL语句能够比使用脚本运行效率高上许多。

今天在工作过程中遇到了如下的一个实际问题:有两个表,数据量较大,分别为表X和表Y,结构如下:

# X表

Key1    Key2    Key3    ...    KeyN
1       Val 1  ...
2       Val 2
3       Val 3
4       Val 4
...     ...
N       Val N
# Y表

KeyA    KeyB    KeyC
2       Val A   0
1       Val B   1
3       Val C   1
2       Val D   0
...     ...     ...
N       Val E   0

需要进行的操作是,找出X表中Key2值中以“ZH_”开头的项目,提取出对应的Key1的值,将Key1的值对应插入Y表的KeyB。插入时,对应的KeyA置为3,KeyC置为0。

例如,在X表中有如下一个条目

Key1    Key2    Key3    ...    KeyN
28      ZH_123  ...

这个条目满足要求,插入表Y

KeyA    KeyB    KeyC
3       28      0

解决

考虑使用如下命令执行批量操作

INSERT INTO table_name (key1, key2, key3 ...) VALUES (val1a, val2a, val3a...), (val1b, val2b, val3b...)...;

要使用如下命令,关键难度在于得到VALUE部分,所以这里使用CONCAT和GROUP_CONCAT组合命令来完成。

首先,使用以下命令,得到组合好格式的VALUES

SELECT GROUP_CONCAT(CONCAT( "(3,",Key1 ,",0)") SEPARATOR ',') FROM Table_X WHERE Key2 LIKE "ZH_%";

#使用上条命令后将得到如下查询结果:
(3,28,0), (3,30,0), (3,41,0), (3,52,0), (3,78,0)...

将结果组合到INSERT INTO语句中,便得到了我们需要的语句:

INSERT INTO Table_Y (keyA, KeyB, KeyC) VALUES (3,28,0), (3,30,0), (3,41,0), (3,52,0), (3,78,0)...;

顺便提一句,使用以下命令是无法完成的:

INSERT INTO Table_Y (keyA, KeyB, KeyC) VALUES (SELECT GROUP_CONCAT(CONCAT( "(3,",Key1 ,",0)") SEPARATOR ',') FROM Table_X WHERE Key2 LIKE "ZH_%");

关于AWS CloudFront缓存机制的探究

Amazon CloudFront 是一项内容传输 Web 服务。它可与其他 Amazon Web Services 产品集成,帮助开发人员和企业在低延迟、高数数据传输、无最低使用承诺的环境下向最终用户轻松发布内容。CloudFront 可使用全球节点网络发布您的整个网站,包括动态、静态、流媒体和交互内容。对您的网站内容的请求将自动路由到最近节点,实现内容发布性能最佳。

简单来说,Amazon云旗下的CloudFront是一个内容分发系统,用于帮助用户缓存站点内容,在客户请求服务时就近分发。

之所以去探究它的缓存机制,是因为在最近工作过程中,使用了CloudFront服务,但是对它的缓存刷新机制并不是很清除,导致在工作中出现疑惑。于是我就去调研了一下这个服务的缓存机制。

在官方说明文档(页面链接)中描述如下:

Typically, CloudFront serves an object from an edge location until the cache duration that you specified passes—that is, until the object expires. After it expires, the next time the edge location gets a user request for the object, CloudFront forwards the request to the origin server to verify that the cache contains the latest version of the object. The response from the origin depends on whether the object has changed:

  • If the CloudFront cache already has the latest version, the origin returns a 304 status code (Not Modified).
  • If the CloudFront cache does not have the latest version, the origin returns a 200 status code (OK) and the latest version of the object.

If an object in an edge location isn’t frequently requested, CloudFront might evict the object—remove the object before its expiration date—to make room for objects that have been requested more recently.

可以用以下流程图表示:

CloudFront

AWS通过以上逻辑来对图片更新做出反应,保证用户在刷新缓存后一定能够获得最新的图片。默认的缓存时间为1天,有两种模式可以选择

1、继承源服务器头部信息

2、手动指定缓存时间

当前我所使用的为第一种模式,即继承源服务器头部信息。下面给出一次访问实例。例如访问网站的一个网页:

20160223103218

我们可以看到,返回的头部状态码为304,即已经缓存。下面查看具体的返回头信息:

20160223103028

可以看到X-Cache处为cloudfront,即从CloudFront取得缓存。Server为openresty,max-age为在服务器上自定义的86400s。可以看出,确实是从服务器处继承了头部信息。

如果需要自定义缓存时间,则需要在AWS的CloudFront控制面板进行修改:

20160223103835

选择Behaviors,点击Edit,自定义其中Cache模式为Customize并自定义时间

20160223103852

CloudFront具有非常智能化的缓存管理机制,在使用默认配置的情况下即可拥有很好的用户体验。但是在定制化方面设置不够人性化,在不阅读文档的情况下很难了解其中具体的信息。

使用UptimeRobot监控网站运行状态

由于公司服务器日益增多,人工维护几十个网站服务器日益吃力。往往一个网站挂了可能几天之后才会知道,这将给公司造成巨大的流量损失。所以需要对网站的运行状态进行检测。开始想在网站上部署监控脚本完成简单的监控,后来发现前人已经有了很多的实践,例如著名的Zabbix、Nagios这种分布式的监控程序。当然,国内也有许多基于云平台的检测,比如360,监控宝之流。

通过前期的调研,所得到的解决方案大概有一下几种:

  1. 类似360、监控宝,基于云平台的监测,需要在服务器上部署一个轻量化脚本。
  2. 类似UptimeRobot,只监控指定端口,无需部署,功能有限。
  3. 类似Zabbix、Nagios,需要自己部署自己配置的开源监控解决方案。
  4. 自己写监控脚本对一些基本信息进行监控。

考虑到公司需求:“快速的监控网站是否正常工作,并给出通知”。我决定使用方案2进行实践。方案1将使公司的服务器状态暴露在第三方手中,并有可能受到第三方服务故障的牵连;方案3部署困难,维护成本高;方案4相比方案2成熟度较低,容易出现漏洞。下面介绍一下部署的过程:

UptimeRobot(网址:uptimerobots.com)是一个免费的监控服务提供商。免费账户提供50个网站的监控,每5分钟对服务状态进行扫描。如果宕机将通过邮件或者应用推送通知管理员。付费账户则提供低至1分钟的扫描服务和短信通知服务以及更多的站点监控。一般情况下免费的账户即可满足需求。

进入网站,注册完成后即进入管理面版,点击左侧“+Monitor”按钮即可添加网站域名

20160221214707

填入域名等信息

20160221214812

监控状态在右侧显示:

20160221214722

同时,网站还开放了监控API,用户可以通过API调取监控结果,这点还是十分方便的。具体在API页面有介绍(页面链接:https://uptimerobot.com/api)。提供了Json、XML两种格式的API。在底部有一些API的应用实例。

这里着重推荐Nerd Baggy提供的StatusPage项目(项目链接:https://github.com/nerdbaggy/StatusPage

这个项目部署之后提供了一个可视化的页面,列举出了所有被监控的网站(Demo)

20160221215450

具体部署过程并不复杂,正常的网站部署即可。部署过程可能会出现错误,具体为有两个文件夹需要手动创建。查看Nginx的错误日志,里头有详细的说明,照着错误建立对应文件夹即可。

Redis的部署与配置

介绍

Redis是一个开源、支持网络、基于内存、键值对存储数据库,使用ANSI C编写。它具有以下优点:

  • 异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
  • 支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
  • 操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
  • 多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

安装和配置

wget http://download.redis.io/releases/redis-3.0.5.tar.gz
tar -zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
make
make install

将四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf 分别拷贝到/usr/redis下,和/etc下

mkdir -p /usr/redis/
cd src
cp redis-server  /usr/redis
cp redis-benchmark /usr/redis
cp redis-cli  /usr/redis
cd ..
cp redis.conf  /etc
# 安装php5-redis
apt-get install php5-redis

配置

在/etc/init.d/中创建redis启动脚本

#!/bin/bash
# chkconfig: 2345 10 90
# description: Start and Stop redis

REDISPORT=6379 
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
EXEC=/usr/redis/redis-server 
REDIS_CLI=/usr/redis/redis-cli 

PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf" #
case "$1" in
        start)
                if [ -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is already running or crashed."
                else
                        echo "Starting Redis server..."
                        $EXEC $CONF
                fi
                if [ "$?"="0" ]
                then
                        echo "Redis is running..."
                fi
                ;;
        stop)
                if [ ! -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is not running."
                else
                        PID=$(cat $PIDFILE)
                        echo "Stopping..."
                        $REDIS_CLI -p $REDISPORT SHUTDOWN
                        while [ -x $PIDFILE ]
                        do
                                echo "Waiting for Redis to shutdown..."
                                sleep 1
                        done
                        echo "Redis stopped"
                fi
                ;;
        restart|force-reload)
                ${0} stop
                ${0} start
                ;;
        *)
                echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
                exit 1
esac

设置开机启动和daemon进程

# 开机启动
chmod u+x redis    
sysv-rc-conf redis on
# 将redis设置为daemon方式启动
vi /etc/redis.conf
daemonize yes

启动redis时出现的两个warning信息解决

echo 1 > /proc/sys/vm/overcommit_memory
echo 511 > /proc/sys/net/core/somaxconn

在Nginx上部署Let’s Encrypt证书

Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. Let’s Encrypt is a service provided by the Internet Security Research Group (ISRG).

下面是我在Nginx服务器上部署它提供的SSL证书的过程:

  • 安装git
apt-get update
apt-get install git
  • 下载安装Let’s Encrypt源码,在etc目录下部署代码
cd /usr/
git clone https://github.com/letsencrypt/letsencrypt letsencrypt
  • SSL证书部署时需要关闭Nginx服务器。
service nginx stop
netstat -na | grep ':80.*LISTEN'
# return null if nginx has stopped
  • 生成SSL证书
cd /usr/letsencrypt
./letsencrypt-auto certonly --standalone
  • 之后将初始化简单的图形界面以安装SSL证书,需要填写域名信息
zivers.com www.zivers.com
  • 看到一下文字时说明证书生成成功
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/zivers.com/fullchain.pem. Your cert will
   expire on 2016-04-22. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
  • 从以上信息中,可以看见,证书被存储到了以下目录
/etc/letsencrypt/live/zivers.com/
#证书路径
/etc/letsencrypt/live/zivers.com/fullchain.pem
  • 修改Nginx配置

加入ssl证书信息,并写入rewrite规则

server {
        listen 80;
        server_name zivers.com;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}
server {
        listen 80;
        server_name www.zivers.com;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}

server {
        listen 443 ssl;
        server_name zivers.com;

        ssl_certificate /etc/letsencrypt/live/zivers.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/zivers.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}

server {
        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/zivers.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/zivers.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
        root /var/www/zivers.com;
        index index.php;

        server_name www.zivers.com;
        ...
}

Gollum Wiki Setup(LNMP)

gollum 是github的使用的一个基于markdown的 wiki系统的构造工具,简单实用。gollum直接和git集成不需要数据库,你可以选择在Web页面撰写文档,也可以用你喜欢的markdown工具编辑文档在命令行进行提交。下面是我在LNMP平台部署gollum的过程。

Server

安装ruby环境

apt-get install ruby1.9.1 ruby1.9.1-dev make zlib1g-dev libicu-dev build-essential git

安装gollum

gem install gollum

安装成功后尝试着在终端输入下面的命令,如果能够正常显示版本号则说明安装成功.我的版本为4.0.1

gollum --v
gollum 4.0.1

Github

在github上创建一个新项目,并开通Wikis。Git Clone Wikis到本地。

cd /srv/www/
git clone git@github.com:HenryZivers/gollum.wiki.git gollum
# 对应的Repo地址为git@github.com:HenryZivers/gollum.git

经过以上操作,在Wiki项目目录中运行gollum即可开启服务器。

cd /srv/www/gollum/
gollum

可以在浏览器中访问

http://<server_ip>:4567/

过程中可能出现两个问题:

Permission denied (publickey).
fatal: Could not read from remote repository.

原因:Github SSH Key免密没做

fatal: remote error: access denied or repository not exported

原因:需要先去Git上的Repo中随便创建一个Wiki页面。

让gollum在后台运行

nohup gollum&

编辑完成后,提交更改

cd /srv/www/gollum
git add .
git push origin master

不妨写一个脚本运行gollum

#!/bin/bash
gollum /srv/www/gollum

执行脚本

chmod +x gollum.sh
nohup ./gollum.sh&

Nginx

绑定域名需要使用Nginx做反向代理,配置参考

server {
        listen 80;
        server_name wiki.zivers.com;

        location / {
                auth_basic "Restricted";
                auth_basic_user_file   conf.d/htpasswd;                
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://localhost:4567;
        }

        error_page 500 502 503 504 /500.html;
        client_max_body_size 1M;
        keepalive_timeout 10;
}

在conf.d下生成登录密钥

cd /etc/nginx/conf.d
htpasswd -c htpasswd Henry

重启nginx

service nginx restart

Ref

http://www.jianshu.com/p/9c35812b9bae

Django使用syncdb创建默认数据库

可以通过下面的命令直接在Django中生成数据库

python managy.py syncdb

如果安装了south可能出现部分表无法建立的情况,解决如下

近日因帮重新删除数据库,使用syncdb进行重新初始化,结果发现有不少表无法建立。

几经排查发现是south导致的问题。

south是针对django自带的syncdb同步models和数据库的缺陷开发的数据迁移工具,South能够检测对models的更改并同步到数据库,可以作为syncdb的替代。

现有不少人都将之做为标配使用。

使用south后,会在app下载建立一个migrations文件夹,由于从其他地方复制过来或遗留的一些app里面含有该文件夹

从而导致syncdb不建立表,将这个文件夹删除即可。

Zabbix Server Setup on Ubuntu(LNMP)

Author@henry 20160218

Installing Zabbix Server

apt-get install zabbix-server-mysql zabbix-frontend-php

Zabbix Server Configuration

vi /etc/zabbix/zabbix_server.conf

Search for the following properties and set them accordingly. Some may already be set correctly, and some you may have to add. Choose a password as well:

DBName=zabbix
DBUser=zabbix
DBPassword=<YOUR_PASSWD>

MySQL Configuration

mysql -u root -p
password:
> create user 'zabbix'@'localhost' identified by '<DB_PASSWD>';
> create database zabbix;
> grant all privileges on zabbix.* to 'zabbix'@'localhost';
> flush privileges;
> \q;
bye

import database tables;

cd /usr/share/zabbix-server-mysql/
sudo gunzip *.gz

mysql -u zabbix -p zabbix < schema.sql
mysql -u zabbix -p zabbix < images.sql
mysql -u zabbix -p zabbix < data.sql

PHP-FPM Configuration

vi /etc/php5/fpm/php.ini

Search for and adjust the following entries. If they do not exist, add them:

post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = UTC

restart php-fpm

service php5-fpm restart

Zabbix Configuration

copy the Zabbix-specific php file into the configuration directory:

cp /usr/share/doc/zabbix-frontend-php/examples/zabbix.conf.php.example /etc/zabbix/zabbix.conf.php

edit configuration file

vi /etc/zabbix/zabbix.conf.php

Edit the following values. Use the same info as when you set up the database earlier:

$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = '<YOUR_PASSWD>'

$ZBX_SERVER                     = '<SERVER_IP>';
$ZBX_SERVER_PORT                = '10051';
$ZBX_SERVER_NAME                = 'zabbix';

Nginx Configuration

add site into Nginx's site-available directory

vi /etc/nginx/site-available/zabbix

sample nginx server configuration file:

root@localhost:/etc/nginx/sites-available# cat zabbix 
server {
    listen 80;
    server_name monitor.domainname.com
    access_log /var/log/nginx/monitor_access.log;
    error_log /var/log/nginx/monitor_error.log;

    root /usr/share/zabbix;

    location / { 
        index index.php;
        error_page 403 404 502 503 504 /zabbix/index.php;
    }

    location ~ \.php($|/) {
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
     }

    location ~ \.(jpg|jpeg|gif|png|ico)$ {
        access_log off; 
        expires 33d; 
    }
}

enable zabbix server

cd /etc/nginx/site-enabled
ln -s ../site-available/zabbix
service nginx restart

Start Zabbix Service

vi /etc/default/zabbix-server

Go to the bottom and adjust the "START" property to read "yes":

START=yes

start zabbix service

service zabbix-server start

Front End Configuration

Visit you site use following url

http://monitor.yourdomain.com/

You will be presented with a login screen. The default credentials are as follows:

Username = admin
Password = zabbix

Login succeed, everything works, congrat!

Bug fix

  • Bug:
    ini_set(): Use of mbstring.internal_encoding is deprecated
    
  • Fix:
    vi /usr/share/zabbix/include/locales.inc.php
    

    Comment out the following line

    # line 25: 
    ini_set('mbstring.internal_encoding', 'UTF-8');
    

Ref:

网申中国银行信用卡及激活

之前一直用的是招行的信用卡,招行的特点是额度提升较快,基本上是三个月一提,但是招行的活动在近几年不如以往给力,而且本人经常海淘,在这一点上,中行的信用卡有着较大的优势。所以决定申请一张中行信用卡。

20160303084525

网申在中行官网就可以完成,过程并不复杂,标准的一套流程:选卡、填写个人信息、填写资产证明和收入证明、提交。由于这是中行的首卡,所以需要填写的资料会比较多和繁琐,加上两次网站页面假死导致资料重填,我差点就失去了继续申请的耐心。还好,第三次成功的递交了所有的申请资料。接下来的时间就是等待了。我是在年前申请的,由于春节的原因,申请周期属于比较长的,正常情况下15天到一个月就会有结果。

大概三周的样子,我在中行的查询接口查到了信用卡已经通过申请,一周以后,信用卡邮寄到了我的手上。

收到信用卡之后,信用卡并不能直接使用,还需要激活才算是真正有效。我以为中行也和招行一样,只需要下个手机APP就可以激活,于是就下载了中行缤纷生活APP。这是一个UI和功能都十分拙劣的APP,忍住一颗吐槽的心搜寻了每个角落,最后放弃。这个APP根本不能用来激活。

于是在网上查询,据说可以电话给客服激活,于是拨打95566。再和客服聊了一通之后,明白了,网申信用卡只有一种激活手段,线下网点激活。既然网申无法网上激活,还是必须要去线下排号,那网申的意义何在。既然这样还不如直接线下申请还能直接电话激活。中行的逻辑反正我是没明白。

于是隔天我来到公司附近的一家中行网点,排了半小时队开始激活。业务员对激活信用卡的业务似乎并不熟悉,想我询问了一些资料之后就和大堂的经理一起去折腾了。又过了半个小时,有了结论,在这个网点是无法激活的。

这里说明以下原因:中行网申信用卡到网点激活时,需要向中行的信用卡管理系统中写入很多信息。其中有一条信息很关键,这条信息只能在网申过程中选择的提卡网点获得(在网申过程中有一步是选择激活卡片的银行),在其他网点是无法写入这条信息的。所以必须去之前选择的网点进行。

所以隔天,我去了家附近的我选择的那个网店,花了半天时间终于激活完成~

所以,申请中行信用卡总结就是两句话:网点填表申请信用卡可以电话激活;网申信用卡(无论首卡二卡),必须去网申时选择的领卡网点激活。