手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:Linux

nginx + acme.sh + frp ,轻松本地+线上 SSL泛域名

如题的组合。由于本地写代码,比较不方便搞成SSL,毕竟自签名证书现在大部分浏览器都不认了。而且现在微信开发(小程序)、APP等都只认SSL。所以才有了利用frp来进行SSL穿透。

步骤我说的简单一点。不详细 说了

如果不需要内网穿透,其实就是 nginx + acme.sh 就Over了,只是nginx需要配置一下(记得泛域名使用的是fullchain.cer,普通 的单域名是用的xxx.domain.cer)

如果需要内网穿透,步骤简要如下

1、frps -> 设置vhost_http_port(本次假定为8888) ,然后利用supervisor 管理frp (可以使得frp异常崩溃后能够重启)【或者使用systemd,各人喜欢】

2、设置nginx,server_name 为 *.app.neatstudio.com (以app.neatstudio.com为例),在proxy_pass中选择使用upstream,设置为刚才的vhost_http_port,例:

XML/HTML代码
  1. upstream app.neatstudio.com {  
  2.     server 127.0.0.1:8888;  
  3. }  
  4.   
  5. server {  
  6.     listen 80;  
  7.     server_name *.app.neatstudio.com;  
  8.   
  9.     listen 443 ssl;  
  10.     ssl on;  
  11.     ssl_certificate /etc/nginx/ssl/*.app.neatstudio.com.fullchain.cer;  
  12.     ssl_certificate_key /etc/nginx/ssl/*.app.neatstudio.com.key;  
  13.   
  14.     ssl_session_cache shared:SSL:20m;  
  15.     ssl_session_timeout 10m;  
  16.   
  17.     ssl_prefer_server_ciphers       on;  
  18.     ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;  
  19.     ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;  
  20.   
  21.     # turn on the OCSP Stapling and verify  
  22.     ssl_stapling on;  
  23.     ssl_stapling_verify on;  
  24.     ssl_trusted_certificate /etc/nginx/ssl/*.app.neatstudio.com.fullchain.cer;  
  25.   
  26.   
  27.   
  28.     add_header Strict-Transport-Security "max-age=31536000";  
  29.   
  30.     location / {  
  31.         proxy_pass http://app.neatstudio.com;  
  32.         include /etc/nginx/proxy_params;  
  33.     }  
  34. }  

3、在本地(或者任意一台想有https的服务器上)安装frpc,设置subdomain就行了,例:

XML/HTML代码
  1. [test.app.ns.com]  
  2. type=http  
  3. port=80  
  4. subdomain=test  

这样就OK了。[]里的test.app.ns.com,为什么取这个名字?是因为。。。frp的客户端中的任意[]包含的TAG,都不能重名(切记)

然后一切Over(因为我使用mac+mamp,所以会更方便的管理域名)

 

Tags: frp, acme.sh, nginx, mamp

清理docker使用空间

 先说明:服务器上慎重,本地可以多折腾(小心volumn中存放的数据,是不是你原来直接存在image里了。如果不是,随意,大不了重新build)

原文来自:https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/
其实主要就几个方式:
 

1. docker system命令

谁用光了磁盘?Docker System命令详解中,我们详细介绍了docker system命令,它可以用于管理磁盘空间。

docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:

docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 147 36 7.204GB 3.887GB (53%)
Containers 37 10 104.8MB 102.6MB (97%)
Local Volumes 3 3 1.421GB 0B (0%)
Build Cache 0B 0B

可知,Docker镜像占用了7.2GB磁盘,Docker容器占用了104.8MB磁盘,Docker数据卷占用了1.4GB磁盘。

docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚吶。

执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多:

docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 10 2.271GB 630.7MB (27%)
Containers 10 10 2.211MB 0B (0%)
Local Volumes 3 3 1.421GB 0B (0%)
Build Cache 0B 0B

2. 手动清理Docker镜像/容器/数据卷

对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器

docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

删除所有dangling镜像(即无tag的镜像):

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

删除所有dangling数据卷(即无用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

Fundebug提供实时、专业的错误监控服务,为您的线上代码保驾护航,欢迎大家免费使用!

3. 限制容器的日志大小

有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。

在Ubuntu上,Docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中:

du -hs /var/lib/docker/
97G /var/lib/docker/

Docker竟然使用了将近100GB磁盘,这也是够了。使用du命令继续查看,可以定位到真正占用这么多磁盘的目录:

92G	/var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53

docker ps可知,nginx容器的ID恰好为a376aa694b22,与上面的目录/var/lib/docker/containers/a376aa694b22的前缀一致:

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a376aa694b22 192.168.59.224:5000/nginx:1.12.1 "nginx -g 'daemon off" 9 weeks ago Up 10 minutes nginx

因此,nginx容器竟然占用了92GB的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。我们Fundebug每天的数据请求为百万级别,那么日志数据自然非常大。

使用truncate命令,可以将nginx容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现,下面是nginx容器的docker-compose配置文件:

nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"

重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了~

4. 重启Docker

有一次,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据Docker disk usage提到过的建议,我重启了Docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的BUG,导致Docker无法清理一些无用目录:

it’s quite likely that for some reason when those container shutdown, docker couldn’t remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.

The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.

我查看了一下内核版本,发现真的是3.13:

uname -r
3.13.0-86-generic

如果你的内核版本也是3.13,而且清理磁盘没能成功,不妨重启一下Docker。当然,这个晚上操作比较靠谱。

--EOF
没有拷贝的很全,比如作者说为什么用docker。说白了,想用就用呗,如果你有旧版本的系统要兼容。docker才是真心方便(不过一个image 2~300M还是挺纠结的。PHP+debian的镜像)
 

How To Add Swap on Ubuntu 14.04

    当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。这个是SWAP 交换分区的作用。 实际上,我们更关注的应该是SWAP分区的大小问题。 设置多大才是最优的。 

    一般来说可以按照如下规则设置swap大小: 

  1. 4G以内的物理内存,SWAP 设置为内存的2倍。
  2.  4-8G的物理内存,SWAP 等于内存大小。 
  3. 8-64G 的物理内存,SWAP 设置为8G。
  4.  64-256G物理内存,SWAP 设置为16G。 

实际上,系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时要根据具体的业务来设置SWAP的值。

实际上在启动腾讯云的时候,swap是禁用的(没注意是系统原因还是其他)。所以就需要打开Swap,DO的网站上就有现成的教程:https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04,可以参考 一下

我这里不转贴。不过原文里有几个命令可能运行不了,比如使用:dd if=/dev/zero of=/swapfile bs=1G count=4,1G一个块可能不行,换成256的话,就OK了。原文中的:fallocate,debian可能无法执行。

然后一步步的执行到底就OK了。当然,要将分区信息加到fstab中,才会每次启动都会带上。

旧版debian增加PHP7.2源

 原来的dobdeb对于jessie等都不再支持7.2了,所以新的7.2只能从sury上进行获取

 
执行:
XML/HTML代码
  1. #!/bin/bash  
  2. # To add this repository please do:  
  3.   
  4. if [ "$(whoami)" != "root" ]; then  
  5.     SUDO=sudo  
  6. fi  
  7.   
  8. ${SUDO} apt-get -y install apt-transport-https lsb-release ca-certificates  
  9. ${SUDO} wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg  
  10. ${SUDO} sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'  
  11. ${SUDO} apt-get update  
记不住没关系,打开网址:https://packages.sury.org/php/,就有Readme了。复制粘贴运行一下就行!
 

正式启用https

 其实早就该启用了,之前在折腾小菜谱的https的时候发现非常麻烦。现在acme.sh进化了,一步走就完成了

 
1、acme.sh --issue -d domain.com --nginx 他会自己找配置
2、将生成好的key,copy到指位位置,为了方便,一般都扔到/etc/nginx/ssl目录下
3、修改nginx配置,在指定的hosts下面添加下列内容:
XML/HTML代码
  1. listen 443 ssl;  
  2. ssl on;  
  3. ssl_certificate /etc/nginx/ssl/neatstudio.com.cer;  
  4. ssl_certificate_key /etc/nginx/ssl/neatstudio.com.key;  
  5.   
  6. ssl_session_cache shared:SSL:20m;  
  7. ssl_session_timeout 10m;  
  8.   
  9. ssl_prefer_server_ciphers       on;  
  10. ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;  
  11. ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;  
  12.   
  13. add_header Strict-Transport-Security "max-age=31536000";  
因为我是用neatstudio.com来创建的,所以生成的文件也就是neatstudio.com.cer和neatstudio.com.key了
 
如果你webserver上东西多,你干脆server nginx force-reload。官方说用reload可能不生效。如果你东西少,你就直接restart算了。
打开https://neatstudio.com ,就OK了。
然后再配置一条。如果是http,就跳到https,(当然 我还没有做这个,因为我还有不少资源用了http的)

Tags: acme.sh, https