centos7 firewall设置

原文:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld1

参考译文:http://blog.csdn.net/steveguoshao/article/details/45999645

查看运行状态

firewall-cmd --state

获取支持的区域列表

firewall-cmd --get-zones

查看区域开放端口:

firewall-cmd --zone=public --list-all

添加端口

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent

重启服务

firewall-cmd --reload

go安装或者版本升级

之前go还停留在1.5现在要升级到最新版。
go是通过环境变量来关联版本的,所以安装和升级其实是一个流程。
对于升级,直接删除或者重命名原来的目录,将新包解压到原来的位置就可以了。
对于安装,就是直接解压,然后配置环境变量,参看 mac下零基础学习go语言-2-开发环境的搭建

下载

golang 官方下载

安装

tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz

结束

MAC下go code安装问题

在安装go lang时,已经设置过GOPATH,go 也运行正常,但是安装 gocode时提示:

Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
package github.com/nsf/gocode: exit status 69

当我们使用sudo 时,提示:

package github.com/nsf/gocode: cannot download, $GOPATH not set. For more details see: go help gopath

虽然之前已经设置,但是当切换权限时,也切换了环境变量,所以当用sudo管理员权限时提示没有设置环境变量。

解决:

sudo env GOPATH=/Users/alex/dev/go 
go get -u github.com/nsf/gocode

在命令行里临时指定env变量,完成

php下使用redis

php下使用redis

client的选择

先去官网看了下php的client支持,选择了:https://github.com/hiproz/php-redis-client
根据文档描述,只支持到redis4.0,所以我们需要安装redis4.0

安装redis4.0

下载 redis4.0

编译:

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar xzf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make

编译完成后,执行文件就在 src目录下,启动redis server

src/redis-server

安装好后,就可以用本地内置的client来测试:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

开机服务自启动

make install 后,reids在源码的util目录下提供了可以直接创建系统service的脚本install_server.sh。直接执行,就可以安装成系统服务:

[root@sz-svr1 utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli

设置成开机自启动:

[root@sz-svr1 /]# systemctl enable redis_6379
redis_6379.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig redis_6379 on

增加密码后的停止

在设置密码后,在我们用systemctl stop redis_xxxx时,redis不会停止,一直输出:

Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

所以我们需要在结束指令中,增加密码参数。具体修改自行参看/etc/rc.d/init.d/reids_xxxx

测试

至此,我们的环境完成了,我们执行测试代码 examples/raw_commands.php,在浏览器输入路径后,页面显示:

result: bar result: bar result: or value with spaces

观察php日志,确认代码,我们知道页面的结果是正确的。

支持php环境下的redis支持就完成了,剩下的就是码业务逻辑了。

hanve fun!

服务器发回了不可路由的地址

今天突然反馈说硬件ftp无法下载了,这期间没有动过相关的部分。于是开始测试分析。

在filezilla中,发现了如下的日志:

服务器发回了不可路由的地址。使用服务器地址代替。

但是可以正常下载。但是硬件设备就无法下载文件。

网上一堆相同的文章和改客户端为主动方式的解决方案,基本无用。

仔细分析,应该还是这个提示在硬件中有影响,打开详细日志,能看到更多信息:

响应: 227 Entering Passive Mode (0,0,0,0,39,62).
状态: 服务器发回了不可路由的地址。使用服务器地址代替。

本能想就应该是指0.0.0.0这个地址了。

据此为线索搜索如下:
https://stackoverflow.com/questions/41046707/vsftpd-returns-0-0-0-0-in-response-to-pasv

https://serverfault.com/questions/821025/vsftpd-passive-reply-with-0-0-0-0-address-even-with-correct-pasv-address

最终修改配置文件:

#connect_from_port_20=YES
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10050
pasv_address=1.2.3.4
pasv_addr_resolve=YES
pasv_promiscuous=YES
listen_ipv6=NO
listen=YES

其中1.2.3.4是云主机的外网地址,不是本机网卡地址。

测试通过,硬件又恢复了。说明硬件也是实现的是pasv方式的ftp获取。

造成这个可能原因:
根据上面的两个帖子,这个问题可能是IPV6环境下的bug

php-fpm及mysql pdo安装

正常在系统版本兼容的情况下,只需要yum就可以全部安装:

yum install php
yum install php-fpm
yum install php-pdo
yum install php-mysql

pdo_mysql.so 驱动就在php-mysql包中。

如果yum安装的pdo_mysql加载有问题:

php -m

看不到对应的pdo_mysql,或者

php -v

有pdo_mysql相关的warning或者错误,则可以参考用源码编译:
pdo_mysql源码编译(github)

php项目的vendor依赖安装

在测试开源代码时,提示vendor/autoload.php找不到。
vendor是composer安装后的系统依赖,默认项目里面是没有的。

安装composer

wget -nc http://getcomposer.org/composer.phar
php composer.phar
mv composer.phar /usr/local/bin/composer 
composer -V

有composer环境安装vendor

一般使用composer的工程,目录下都有现成的配置文件composer.json,主要描述了工程需要的各种依赖和需求:

{
  "name": "cheprasov/php-redis-client",
  "version": "1.8.0",
  "description": "Php client for Redis. It is a fast, fully-functional and user-friendly client for Redis, optimized for performance. RedisClient supports the latest versions of Redis starting from 2.6 to 4.0",
  "homepage": "http://github.com/cheprasov/php-redis-client",
  "minimum-stability": "stable",
  "license": "MIT",
  "authors": [
    {
      "name": "Alexander Cheprasov",
      "email": "acheprasov84@gmail.com"
    }
  ],
  "autoload": {
    "psr-0": {
      "RedisClient\\": "src"
    }
  },
  "require": {
    "php": ">=5.5"
  },
  "require-dev": {
    "phpunit/phpunit": "4.8.*",
    "cheprasov/php-extra-mocks": "^1.0.0"
  }
}

我们在项目的的composer.json同级目录下执行:

composer install

正常成功后:

Writing lock file
Generating autoload files

至此,verdor目录生成

无composer环境直接安装vendor

如果没有安装过composer,也可以直接通过php安装,在项目根目录下执行(有composer.json的目录):

php composer.phar require xxx

xxx是composer.json 中的name字段。

密码管理app体验

  1. CODE: 密码工具。进去后,每条密码是明文,特点是每条记录按用户名和密码分开存储显示     评价 :一般
  2. keeper:密码工具。记录是明文存储,支持  faastfill ,支持 keeper DNA    评价:中
  3. 隐私卫士:app隐私锁 评价:高
  4. 私密锁:app锁,评价:一般
  5. 应用程序锁:评价:一般
  6. 隐私应用锁:app锁。评价低
  7. 密码本:密码工具,每个字段分开存储。 评价 :中
  8. NS Wallet :分文件夹-item 对字段做了详细的分类。 :一般
  9. safeincloud :有详细的模板 ,支持云同步 评价:高
  10. SSE  功能强大,支持密码管理 ,文件本加密 ,文件加密  评价 :高
  11. password keepox: 简单的字段记录,支持同步到dropbox ,评价:低
  12. 秘密管理器:简单的字段记录:评价:极低
  13. sis密码管理:同上

instagram pinterest 花瓣 图钉的图片采集方式

这几款应用是目前国内外主流的图片流社交应用,具有一定的代表性,我们来看下其内容的来源:

instagram

本地图片,相机图片和视频

pinterest

本地图片,相机,URL提取,不支持视频
URL提取这个好强大,输入www.taobao.com,生成如下的视图,用户可以直接选区要采集的图片
1.pic
Pinterest 提供web plug,用户安装后可以在浏览网页时右键直接

花瓣

采集功能跟pinterest貌似一样,但URL采集移动端根本不可用,只是装个样子,pc浏览器的插件是好用的

图钉

跟instagram一样,但是感觉里面的内容都是官网自己更新的,没有真正的活跃度。

从上面几款可以看出,这类的应用基本都是instagram 和pinterest的高仿,形式大于内容。既然形式上没有太大的创新空间,内容就是关键了,怎么引导用户UGC,怎么建设活跃的用户习惯,就是这类应用的关键了。

分布式系统最终一致性的一些思考

目前互联网的架构大部分都期望最终的系统scalable,所以一般都设计成分布式系统,所以一个最重要的问题就是数据一致性,分布在各个角落的数据,保证一致性,才能提供一个统一的可用业务。

几个基本概念
– ACID
– CAP
– BASE

可用性没有简单的统一解决方案,没有什么神奇的中间件或者第三方可以满足任何业务场景,但有几个基本的思路

异步确认:通过目标的异步确认为事件的结果确认,在没有异步确认前,进行多次尝试,或者交由消息队列

消息队列:事件发出后,交由消息队列,由队列自身完成投递和错误补偿机制,确保事务的到达。但最终还是以目标的确认为最终事件的结果

接口的幂等性:因为存在重试和错误补偿机制,不可避免的在系统中存在重复收到消息的场景,接口的幂等性能提高数据的一致性

锁:本地锁和分布式锁,对关键路径进行加锁,保证数据的一致性

业务模拟事务:根据实际的业务分割,对最小业务完整数据流,做业务层次的事务管理, 进行历史纪录和回滚。

数据库事务:这个事最基本的要求

通过分析具体的业务,在不同的业务节点使用以上不同的策略,最终实现整体的一致性,提高系统可用性。