作者:matrix
发布时间:2017-04-17
分类:零零星星
http2.0早就开始实行了,忽然间才看到其实很多网站都有使用了http2.0协议,aliyun.com都有了,其他巨头是在打瞌睡吗?
图中显示的Request完全和http1.1的请求完全不同 这,就是高科技!
要求
若想使用http2.0,浏览器和服务器端也都有要求。浏览器用最新版Chrome或其他,服务器端网站配置就麻烦多了。
服务器端OpenSSL库的版本要支持ALPN(1.0.2+ 目前最新为1.1.0e),之前是用SPDY,NPN,后来google只支持ALPN,也就是说未来就是HTTP/2 + ALPN
为什么我们应该尽快支持 ALPN?
需要给网站域名配置证书
nginx版本需要1.9.5+(目前最新版本1.12.0)
若你的服务器openssl或nginx本来就达不到要求,建议都重新安装升级才对。之前只是把openssl升级到最新版本,且Lnmp1.3中的nginx是1.10的版本完全符合要求(其中也有必须的httpv2和ssl模块)就没有给nginx做升级操作,以为可以用http2.0 结果给vhost的conf文件添加了listen 443 ssl http2;
重启nginx N次都没有任何反应,最后还是更新nginx才解决。就是因为之前安装nginx的时候openssl没有达到版本要求,就算升级了服务器openssl也没有卵用。
> openssl version #查看openssl 版本
> nginx -V #查看nginx版本以及模块
服务器配置
环境 ubuntu 14 64bit
LNMP 1.3 NGINX 1.10
升级openSSL库
>openssl version -a #查看openssl 信息 用于升级
>cd #进入默认目录
>wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
>tar -zxvf ./openssl-1.1.0e.tar.gz
>cd openssl-1.1.0e/
>./config --prefix=/usr/lib/ssl --openssldir=/usr/lib/ssl
#注意--prefix=/usr/lib/ssl为之前openSSL的安装目录,--openssldir表示安装目录 默认值就为/usr/lib/ssl
>make && make install
>mv /usr/bin/openssl /usr/bin/openssl-old
>mv /usr/include/openssl /usr/include/openssl-old
>ln -s /usr/lib/ssl/bin/openssl /usr/bin/openssl
>ln -s /usr/lib/ssl/include/openssl /usr/include/openssl
>echo "/usr/lib/ssl/lib">>/etc/ld.so.conf
>ldconfig
#现在看看版本号就是最新的了
参考:https://www.douban.com/note/563948878/
若升级openssl导致ss服务无法使用参考:
更新OpenSSL库至最新版本导致sss服务无法启动
配置证书
不详细说明,之前有方法安装Let’s Encrypt证书
安装&升级nginx
最新版本1.12.0
本来是使用lnmp安装目录中自带的upgrade.sh
进行自动升级操作,后来发现有问题,升级时出现openssl library not found
,不过就算是自动升级也不敢保证LNMP编译nginx的时候是否使用的最新版本openssl库,还是手动升级操作。
>wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.3.2.zip
>unzip nginx-ct.zip
>cd lnmp nginx-1.12.0
>./configure --add-module=../ngx_brotli --add-module=../nginx-ct-1.3.2 --with-openssl=../openssl-1.1.0e --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
#这里http_v2_module,http_ssl_module,with-openssl才是必须要配置的,其他module看个人实际安装情况
>cd /usr/local/nginx/sbin
>cp nginx nginx.old #备份旧版nginx
>cd ~/nginx-1.12.0
>make upgrade #升级操作
修改vhost中域名配置文件
文件位置:/usr/local/nginx/conf/vhost
修改对应域名的配置文件,在server段中添加listen 443 ssl http2;
就可以了
参考 hhtjim.com:
server
{
listen 80;
listen 443 ssl http2;
#listen [::]:80;
ssl on;
ssl_certificate /etc/letsencrypt/live/hhtjim.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hhtjim.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; #加密算法(CloudFlare 推荐的加密套件组)
ssl_prefer_server_ciphers on; #优化 SSL 加密套件
ssl_session_timeout 10m; #客户端会话缓存时间
ssl_session_cache builtin:1000 shared:SSL:10m; #SSL 会话缓存类型和大小
ssl_buffer_size 1400;
add_header X-UA-Compatible "IE=edge,chrome=1"; #IE 用最新内核渲染页面
server_name hhtjim.com www.hhtjim.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/hhtjim.com;
include other.conf;
#error_page 404 /404.html;
include enable-php.conf;
include wordpress.conf;
if ($http_host !~ "^www.hhtjim.com$"){
rewrite ^(.*) https://www.hhtjim.com$1 permanent;
}
if ($scheme = "http"){
rewrite ^(.*)$ https://$host$1 permanent;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/hhtjim.com.log;
}
重启nginx
>lnmp nginx restart
之后再访问就可以看到使用http2.0协议了
FAQ
若安装失败,请参照 Nginx 配置之完整篇
参考:
https://imququ.com/post/my-nginx-conf.html
http://www.cnblogs.com/shiv/p/5271711.html
http://www.jb51.net/article/47755.htm
作者:matrix
发布时间:2017-04-16
分类:零零星星
ubuntu升级openssl库到openssl 1.1.0e版本,过程倒还好,到底还是成功了。但是reboot重启系统之后发现ss服务无法打开,这可是目前我唯一的科学电梯啊。
不过还好找到报错信息有解决办法。
>ssserver --version
shadowsocks 2.8.2 版本
报错:
root@root-VM:/usr/local/bin# ./ssserver -c /etc/shadowsocks.json -d start
INFO: loading config from /etc/shadowsocks.json
2017-04-16 19:05:10 INFO loading libcrypto from libcrypto.so.1.1
Traceback (most recent call last):
File "./ssserver", line 9, in <module>
load_entry_point('shadowsocks==2.8.2', 'console_scripts', 'ssserver')()
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/server.py", line 34, in main
config = shell.get_config(False)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 262, in get_config
check_config(config, is_local)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 124, in check_config
encrypt.try_cipher(config['password'], config['method'])
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 44, in try_cipher
Encryptor(key, method)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 83, in __init__
random_string(self._method_info[1]))
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 109, in get_cipher
return m[2](method, key, iv, op)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 76, in __init__
load_openssl()
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 52, in load_openssl
libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
File "/usr/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/ssl/lib/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup
说到底都是升级openssl导致无法使用,旧版EVP_CIPHER_CTX_cleanup函数被弃用改为EVP_CIPHER_CTX_reset
办法
定位到/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py
文件:
修改52,111行处的EVP_CIPHER_CTX_cleanup
为EVP_CIPHER_CTX_reset
重启服务,解决。
实际情况根据自己的ss版本查找修改相关文件
参考:http://blog.csdn.net/blackfrog_unique/article/details/60320737
PEACE
作者:matrix
发布时间:2017-04-02
分类:零零星星
官网
https://telegram.org/
聊天软件Telegram来历不小,CEO是俄罗斯最大社交网站创始人,什么什么两兄弟。
软件好像15年就有了,只是我现在才知道。里面真的是好多内容,包括政治,H网等等。很好奇,自然也进去玩玩。
软件开发的初衷就是为了隐私信息安全
,信息加密。
https://livc.io/177
好了。我的目的是除了书签之外再留一份TG群的链接。
各种群以及聊天频道
http://120.77.47.131/telegram.html
http://www.telegram.url.tw/index.html
机器人store:https://storebot.me/top/news
或者通过资源机器人Bot: @GroupHub
还没玩过的朋友不妨试试,很Nice. 反正ISIS这类的恐怖组织在用。
现在最新版本V3.18支持免费打电话,使用过程需要梯子科学上网,且无中文,不过这个单词量真心不大。
参考:
https://livc.io/177
PEACE
作者:matrix
发布时间:2017-02-15
分类:零零星星
断网的时候chrome中会出现恐龙小游戏T-Rex/Dino。
来自 @thecodepost
试玩
html
http://www.hhtjim.com/wp-content/uploads/2017/02/T-RexGame.html
参考:http://www.thecodepost.org/internet/play-hidden-T-Rex-game-offline-chrome/
http://www.cnblogs.com/undefined000/p/trex_8.html
作者:matrix
发布时间:2017-02-13
分类:Linux 零零星星
Linux后台守护进程化有nohup,screen命令可一般解决。但突发崩溃情况就不能很好的保证进程在后台的驻留。
supervisor是一个python脚本编写的工具,可以起到很好的管理、监控进程的作用。
安装
Debian类系统安装:
pip install supervisor #建议使用方式 避免旧版本导致的一系列问题
#或者
sudo apt-get install supervisor
选择y
确认操作后即可安装完成。
配置
- 查看supervisord.conf
- supervisord已自动启动
使用 ps -aux|grep supervisord
查看supervisord进程信息,-c
参数就是指定使用的配置文件
如图 我这里的配置文件就是/etc/supervisor/supervisord.conf
- supervisord 手动启动
执行supervisord
命令即可启动supervisord工具。
默认会读取/etc/supervisord.conf
配置文件,若不存在可能就需要自己手动创建:
$ echo_supervisord_conf > /etc/supervisord.conf
文件末尾include
位置是定义需要管理的进程配置信息载入路径:
[include]
files = /etc/supervisord.d/*.ini
这里表示supervisord会读取/etc/supervisord.d/目录下的所有ini配置文件;这里支持多个文件列表的传入 用空格隔开即可。如:
[include]
files = /etc/supervisord.d/*.ini /home/supervisord_conf/*.ini
- 创建进程命令配置ini文件
进入/etc/supervisord.d/
目录,创建ini文件
e.g. ws.ini:
文件名称可自定
[program:ws]
user=www ;执行进程的用户
command=php /home/wwwroot/chat.hhtjim.com/wsServer.php
autostart=true ;是否随系统自动启动
autorestart=true ;自动重启
startretries=10 ;启动失败时的最多重试次数 默认3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 2 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /root/logs/rss2channel_stdout.log
说明:
program 表示自定义的任务名称
command 执行的命令
其他配置官方手册:
http://supervisord.org/configuration.html#program-x-section-values
启动
supervisord -c /etc/supervisord.conf
/etc/supervisord.conf为默认的配置文件,可自定
查看
- cli方式
> supervisorctl #进入命令行
> reload #重新载入配置
> status #状态查看
- web页面方式
supervisord.conf文件中需要配置
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
设置后执行supervisorctl reload
重启再访问IP:9001
就能监控supervisord的运行状态。
报错
unix:///var/run/supervisor.sock no such file错误
确保已经启动supervisord
进程。
ps -aux|grep supervisord #查看是否存在进程
unix:///tmp/supervisor.sock no such file 错误
解决办法:
vi /etc/supervisord.conf
#把sock文件所在tmp目录的配置修改为/var/run目录
主要修改如下配置:
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
file=/var/run/supervisor.sock ;
......
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=unix:///var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除
修改操作参考:
http://www.cashqian.net/blog/001472975510127673ea63db9234c4e8293cf43cefcafde000
最后执行更新:
supervisorctl update
socket.py line: 224错误
如果修改上面tmp目录再更新出现错误:
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
解决:
先执行启动命令:supervisord
再supervisorctl update
如果还是报错,那需要重新安装。因为版本太旧会导致这种问题
uwsgi无法启动
取消或注释uwsgi配置文件中的daemonize
附 使用的supervisord.conf:
; Sample supervisor config file.
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
;chmod=0700 ; sockef file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
;umask=022 ; (process file creation umask;default 022)
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
;directory=/tmp ; (default is not to cd during start)
;nocleanup=true ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value ; (key value pairs to add to environment)
;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.
;[program:theprogramname]
;command=/bin/cat ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask=022 ; umask for process (default None)
;priority=999 ; the relative start priority (default 999)
;autostart=true ; start at supervisord start (default: true)
;autorestart=true ; retstart at unexpected quit (default: true)
;startsecs=10 ; number of secs prog must stay running (def. 1)
;startretries=3 ; max # of serial start failures (default 3)
;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A=1,B=2 ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)
; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.
;[eventlistener:theeventlistenername]
;command=/bin/eventlistener ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
;events=EVENT ; event notif. types to subscribe to (req'd)
;buffer_size=10 ; event buffer queue size (default 10)
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask=022 ; umask for process (default None)
;priority=-1 ; the relative start priority (default -1)
;autostart=true ; start at supervisord start (default: true)
;autorestart=unexpected ; restart at unexpected quit (default: unexpected)
;startsecs=10 ; number of secs prog must stay running (def. 1)
;startretries=3 ; max # of serial start failures (default 3)
;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A=1,B=2 ; process environment additions
;serverurl=AUTO ; override serverurl computation (childutils)
; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.
;[group:thegroupname]
;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions
;priority=999 ; the relative start priority (default 999)
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisord.d/*.ini
环境变量无法读取
本来在/etc/profile
文件末尾添加环境变量的声明,也执行了source
## production environment
export RUN_ENV="TEST"
但是今天意外发现进程服务无法读取到环境变量信息。
需要配置supervisord
段的environment,让supervisord能正常读取指定环境变量RUN_ENV
[supervisord]
environment=RUN_ENV="%(ENV_RUN_ENV)s"
可以在/etc/supervisord.conf
文件中新增supervisord
,也可以在/etc/supervisord.d/*.ini
中的进程文件中添加
意外FATAL
如果长时间执行有可能会造成意外中断,这里最好做定时检测重启
check.sh
#!/bin/bash
status=`/usr/bin/supervisorctl status rss2channel|awk '{print $2}'`
if [ $status == 'STOPPED' -o $status == 'FATAL' ]; then
/usr/bin/supervisorctl restart rss2channel >/dev/null 2&>1
fi
检测STOPPED
或者 FATAL
状态就执行重启
rss2channel
为配置名称
再配合crontab定时任务 每小时检测
0 */1 * * * /bin/bash /root/check.sh
扩展/修改启动脚本的配置
默认脚本启动目录:/etc/supervisord.d
如果需要新添加启动脚本eth_kline.ini
配置而不想重载reload
所有。可以先执行reread
,再add
就可以了
$ supervisorctl reread
>>> eth_kline: available
$ supervisorctl add eth_kline
>>> eth_kline: added process group
这样即可无痛扩展 不用重启所有已运行的脚本
如果需要修改也差不多 要使用update
命令:
$ supervisorctl reread eth_kline
>>> eth_kline: changed
$ supervisorctl update eth_kline
>>> eth_kline: stopped
>>> eth_kline: updated process group
通配符操作
默认supervisorctl操作的名称不支持通配符 但是可以使用awk来达到效果
比如我想重启所有包含_kline
关键字的进程脚本名 /usr/bin/supervisorctl restart *_kline
,让它匹配*_kline
符合的name进程脚本名,然而supervisorctl不支持。
解决办法:
/usr/bin/supervisorctl restart `/usr/bin/supervisorctl status |awk '{print $1}'|grep -E ".*_kline"`
参考:
http://supervisord.org
http://liyangliang.me/posts/2015/06/using-supervisor/
http://www.tuicool.com/articles/Ejm2u2
http://stackoverflow.com/questions/16171338/supervisord-cant-find-command-in-virtualenv-folder
https://neo1218.github.io/supervisor/
https://blog.csdn.net/qq_27754983/article/details/78782866
https://serverfault.com/questions/511707/supervisord-error-class-socket-error
作者:matrix
发布时间:2017-02-11
分类:零零星星
重启系统发现mysql启动失败。
环境为 ubuntu Lnmp
Starting MySQL
. * The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
/var/run/mysqld/
目录中没有pid文件
找到网上说的文件权限、磁盘已满,这些都不符合情况。
解决
删除文件my.cnf
> rm /etc/mysql/my.cnf
启动mysql
lnmp mysql start
最后启动成功就ok
peace
参考:
http://blog.ich8.com/post/5635
https://bbs.vpser.net/viewthread.php?tid=13217
作者:matrix
发布时间:2017-01-15
分类:兼容并蓄 零零星星
Let’s Encrypt证书出来已经有很长时间,之前用主机未到期,也就干瞪眼。
现在手上拿了一台有设备,其实算下来价格也都差不多,国外的速度是慢点,但是好处很多。
测试环境:
ubuntu 14 64bit
lnmp 1.3
获取证书
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --standalone --email hhtjim@foxmail.com -d hhtjim.com -d www.hhtjim.com
# 若服务器已经占用80端口开启webserver则只需执行webroot:
# ./letsencrypt-auto certonly --webroot --email hhtjim@foxmail.com -d link.hhtjim.com
执行完上面三个命令之后会有图形界面出现
选择Agree之后出现这个也就完成了证书的获取
安装证书
修改域名对应下的nginx配置
进入/usr/local/nginx/conf/vhost目录找到和域名同名的conf文件
在server代码块中添加:
listen 443 ssl;
#listen [::]:80;
ssl on;
ssl_certificate /etc/letsencrypt/live/域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
参考如下完整配置
server
{
listen 80;
listen 443 ssl;
#listen [::]:80;
ssl on;
ssl_certificate /etc/letsencrypt/live/hhtjim.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hhtjim.com/privkey.pem;
server_name hhtjim.com www.hhtjim.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/hhtjim.com;
include other.conf;
#error_page 404 /404.html;
include enable-php.conf;
include wordpress.conf;
if ($http_host !~ "^www.hhtjim.com$"){
rewrite ^(.*) https://www.hhtjim.com$1 permanent;
}
if ($scheme = "http"){
rewrite ^(.*)$ https://$host$1 permanent;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/hhtjim.com.log;
}
接着准备重启nginx:lnmp nginx restart
参考:loazuo
更新操作
按照网上大多执行的命令我这里就会出现交互界面,需要手动选择webroot目录
How would you like to authenticate with the ACME CA?
x x 1 Place files in webroot directory (webroot) x x
x x 2 Spin up a temporary webserver (standalone)
还好找到办法,只需要添加参数 --webroot -w 设置好存放web路径即可。最终参考如下
ubuntu下保存为sh文件。记得附加x执行权限。然后执行该sh文件即可自动更新证书.
#!/bin/sh
~/letsencrypt/letsencrypt-auto certonly --webroot -w /home/wwwroot/www.hhtjim.com/ --renew-by-default --email hhtjim@foxmail.com -d hhtjim.com -d www.hhtjim.com && lnmp nginx restart
若报错Failed authorization procedure...
则需要修改-w参数
为网站根目录
如:
-w /home/wwwroot/hhtjim.com/
且nginx配置中将.well-known加入白名单:
location ~ /.well-known {
allow all;
}
参考:
http://letsencrypt.readthedocs.io/en/latest/using.html
https://www.ubock.com/article/25
https://stackoverflow.com/questions/42269107/using-certbot-to-apply-lets-encrypt-certificate-failed-authorization-procedure
最后的定时执行
修改定时任务 crontab -e
0 0 1 * * /root/updateLetsEncrypt.sh
#每月1号执行sh脚本
重启定时服务 /etc/init.d/cron restart
peace
作者:matrix
发布时间:2017-01-13
分类:零零星星
这个季节看到TGP的LOL新闻页面的飘雪效果挺好看的。顺手就copy了下
飘雪效果网上貌似大多数代码都是http://x-team.com 。
css,js,png文件都整理出来了也就记录下。 都取自15w.com
直接盗链
建议代码放到html中的body标签中的底部加载
<link rel="stylesheet" href="//www.15w.com/ui/pages/others/2016/snow/css/snow.css?v3" type="text/css" />
<script type="text/javascript" src="//www.15w.com/ui/pages/others/2016/snow/js/snow.js?v5"></script>
<script>
createSnow("img/", 30);
</script>
若是WordPress:
add_action('wp_footer', 'snow_footer');
function snow_footer()
{
if ('1' === date("n")) {//一月份才会有飘雪效果
print <<<R
<link rel="stylesheet" href="//www.15w.com/ui/pages/others/2016/snow/css/snow.css?v3" type="text/css" />
<script type="text/javascript" src="//www.15w.com/ui/pages/others/2016/snow/js/snow.js?v5"></script>
<script>
createSnow("img/", 30);
</script>
R;
}
}
文件本地化
文件: https://pan.baidu.com/s/1i5cAnhb#383t
提取码在#字符后面
注意需要修改snow.js 105行处代码
peace
P.S. 180206
jd页面的飘雪效果。依赖JQ
页面中添加画布div容器
<div class="snow-container" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 100001;"></div>
然后引入js
three.js和snow.js(可修改为本地的离线图片)
资源包:jd-snow
- 1
... - 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
... - 23