JEFFREY

feiworks.com

自签证书并加证书信任列表

yum install openssl
yum install openssl-devel
#创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 1024

#创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr

#在加载SSL支持的Nginx并使用上述私钥时除去口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

#标记证书使用上述私钥和CSR:
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
#nginx conf
server {
    server_name YOUR_DOMAINNAME_HERE;
    listen 443;
    ssl on;
    ssl_certificate server.crt;
    ssl_certificate_key server.key;
}
#追加到信任列表
cat server.crt >> /etc/pki/tls/certs/ca-bundle.crt

Docker & Elasticsearch

docker pull elasticsearch:6.5.0

docker run -d \
--name es \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms1600m -Xmx1600m" \
elasticsearch:6.5.0

docker exec -it es /bin/bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip

docker cp es:/usr/share/elasticsearch/config /data/es
docker cp es:/usr/share/elasticsearch/data /data/es
docker cp es:/usr/share/elasticsearch/plugins /data/es

elasticsearch.yml config:
node.name: master
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0

docker run -d \
--name es \
-p 9200:9200 -p 9300:9300 \
-v /data/es/config:/usr/share/elasticsearch/config \
-v /data/es/data:/usr/share/elasticsearch/data \
-v /data/es/plugins:/usr/share/elasticsearch/plugins \
elasticsearch:6.5.0

nginx部署HTTPS、HTTP/2

下载:

wget -c https://www.openssl.org/source/openssl-1.1.0.tar.gz 
wget -c https://nginx.org/download/nginx-1.11.3.tar.gz

 编译、升级:

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_slice_module --with-http_v2_module --with-openssl=../openssl-1.1.0
make
mv /usr/local/nginx/sbin/nginx{,.old}
cp objs/nginx /usr/local/nginx/sbin/nginx

编译时如果提示变量SSL_R_NO_CIPHERS_PASSED未定义,可以打开src/event/ngx_event_openssl.c文件,删除以下这行

|| n == SSL_R_NO_CIPHERS_PASSED

说明:

安装最新版openssl支持ALPN,用于浏览器协商HTTP/2。系统默认openssl比较旧,从1.0.2版本以上才开始支持ALPN。

如果ssl_prefer_server_ciphers设置为on,可能HTTP/2不一定工作,降级为HTTP1.1,可尝试注释,这里的Caveats小节有相关说明。


获取证书:

使用https://www.startssl.com/的免费证书,使用 OpenSSL 或网站提供的工具生成 SSL Key 和 CSR 文件,用 CSR 文件提交签署得到 CRT 证书。


优化过的nginx配置文件:

http节加入:

#配置共享会话缓存大小
    ssl_session_cache   shared:SSL:10m;
#配置会话超时时间
    ssl_session_timeout 10m;

HTTP跳转HTTPS:

server {
  listen 80;
  server_name feiworks.com www.feiworks.com;
  return 301 https://www.feiworks.com$request_uri;
}

HTTPS及HTTP/2配置:

server
{
        listen        443 ssl http2;
        ssl_certificate     /usr/local/nginx/conf/1_feiworks.com_bundle.crt;
        ssl_certificate_key /usr/local/nginx/conf/feiworks.key;
        keepalive_timeout   70;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #定义算法
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
        #减少点击劫持
        add_header X-Frame-Options SAMEORIGIN;
        #禁止服务器自动解析资源类型
        add_header X-Content-Type-Options nosniff;
        #防XSS攻击
        add_header X-Xss-Protection 1;
......

上述dhparam.pem文件的生成:

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 2048

在线测试是否支持HTTP/2、ALPN

https://tools.keycdn.com/http2-test

在线测试SSL Server安全性

https://www.ssllabs.com/ssltest/index.html


解决mysql使用autocommit导致挂起的bug

torndb使用MySQLdb连接远程mysql,会挂起超时,提示Lost connection to MySQL server during query。

跟踪后发现在autocommit后hang住,解决办法hook这个方法,直接返回。

使用下面的代码,之后再连接数据就不会挂起了。

from MySQLdb.connections import Connection
def func(self,t):
	return None
Connection.autocommit=func

php在pdo方式下对mysql导入导出

<?php 
header("Content-Type:text/html;charset=utf-8"); 
/* 
* 数据库导出调用 
*/ 
$host = '';//主机名 
$dbname = '';//数据库名 
$us

tornado缓存

class CacheBaseHandler(tornado.web.RequestHandler):
  
    def prepare(self):
        # 这里判断一下是否是GET请求,是否是非登陆用户,才做以下处理
        cached = self.application.db.cache.find_one({"slug": self.request.path})
        if cached is not None:
            self.write(cached["content"])
            self.finish()
  
    def render_string(self, template_name, **kwargs):
        html_generated = \
            super(CacheBaseHandler, self).render_string(template_name, **kwargs)
        self.application.db.cache.update({"slug": self.request.path},
            {"$set": {"content": html_generated}},
            upsert=True)
 
        return html_generated
 
    def on_finish(self):
        """ 重写结束请求前的方法函数 """
        if self.request.method == "POST":
            # 如果遇到POST提交则清空缓存
            self.application.db.cache.remove({"slug": self.request.path})

url计数

CREATE TABLE `ps_url2` (
  `text` varchar(300) DEFAULT NULL,
  `url` varchar(500) DEFAULT NULL,
  `url_crc` int(11) unsigned NOT NULL DEFAULT '0',
  `count` int(11) DEFAULT '0',
  PRIMARY KEY (`url_crc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TRIGGER IF EXISTS `pseudohash_crc_ins`;
DELIMITER ;;
CREATE TRIGGER `pseudohash_crc_ins` BEFORE INSERT ON `ps_url2` FOR EACH ROW begin set NEW.url_crc=crc32(NEW.url);end
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `pseudohash_crc_upd`;
DELIMITER ;;
CREATE TRIGGER `pseudohash_crc_upd` BEFORE UPDATE ON `ps_url2` FOR EACH ROW begin set NEW.url_crc=crc32(NEW.url);end
;;
DELIMITER ;

记录text和url,采用crc32作为主键,插入与更新的时候用触发器更新url的crc32,采用crc32可以加快查询速度。

mysql的哈希索引只能在memory引擎的表中使用,mysql重启后表数据会丢失。

插入数据一条语句搞定:

insert into ps_url2(text,url) values(%s,%s) on duplicate key update count=count+1

on duplicate key确保插入时有重复数据自动更新原数据count数。

IIS性能监测

IIS性能监测脚本,统计一段时间内网站访问情况及系统性能表现。


IIS监测.rar

mysql慢语句追踪

SET GLOBAL log_slow_queries = ON;  打开慢日志记录
SET GLOBAL long_query_time = 3; 设置超过3秒为慢日志
show variables like 'slow_query_log_file'; 查看慢日志文件路径

set profiling=1; 打开性能跟踪
show profiles; 显示列表
show profile for query 1; 显示查询1

生产环境部署Supervisor与Tornado

1、安装supervisor

easy_install supervisor

2、配置supervisor

echo_supervisord_conf > /etc/supervisord.conf
vim /etc/supervisord.conf
[program:jfweb]
command=python /home/www/server/web.py -port=81%(process_num)02d
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
numprocs=16
numprocs_start=1
[program:jfweb_admin]
command=python /home/www/server/admin_web.py
process_name=%(program_name)s
autostart=true

Powered By Z-BlogPHP 1.5 Zero

Copyright @ 2014-2019 All Rights Reserved.
feiworks.com