shadowsocks+nginx+v2ray-plugin配置以及完善

由于shadowsocks缺乏伪装手段,而v2ray又过于臃肿庞大,便选择了一种折中的方式,shadowsocks+v2ray-plugin。为了方便,使用docker-compose来部署

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3"
services:
nginx:
build: ./nginx
ports:
- 80:80
- 443:443
- 443:443/udp //映射udp端口
volumes:
- ./www:/home/wwwroot
- ./nginx/conf:/etc/nginx
- ./nginx/logs:/home/wwwlogs
restart: always
container_name: nginx
shadowsocks-libev:
build: ./shadowsocks-libev
volumes:
- ./shadowsocks-libev/config:/etc/shadowsocks-libev
restart: always
container_name: shadowsocks-libev
shadowsocks配置文件
1
2
3
4
5
6
7
8
9
10
11
12
{
"server": "0.0.0.0",
"mode": "tcp_and_udp",
"server_port": 10086,
"password": "password",
"method": "aes-256-gcm",
"fast_open": true,
"no_delay": true,
"timeout": 60,
"plugin": "v2ray-plugin",
"plugin_opts": "server;path=/ss"
}
阅读更多

Docker中安装PHP扩展踩坑

Docker中安装扩展坑还是挺多的,各种依赖不全。不像lnmp一键包默认就给你装好了常用的扩展。这里直接给个Dockerfile
这个Dockerfile包含扩展:

  • gd
  • exif
  • mysqli
  • pdo_mysql
  • zip
  • imagick
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FROM php:7.4.3-fpm-alpine

    ENV TIME_ZONE=Asia/Shanghai

    RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime \
    echo $TIME_ZONE /etc/timezone \
    apk update \
    apk --no-cache add autoconf gcc g++ make ffmpeg graphicsmagick zip zlib-dev libjpeg-turbo-dev libpng-dev freetype-dev imagemagick-dev libzip-dev \
    docker-php-ext-configure gd --with-freetype --with-jpeg \
    docker-php-ext-install gd \
    docker-php-ext-install exif mysqli pdo_mysql zip \
    pecl install imagick \
    docker-php-ext-enable imagick
    需要注意的是gd的安装需要先用--with-freetype --with-jpeg参数configure一遍,不然装完后是不完整的,没有jpeg的支持,像wordpressh5ai就没法正常使用

为Docker中的Nginx启用Brotli压缩算法

由于Brotli属于第三方模块,Nginx的官方Docker镜像并没有集成,所以只能自己添加,好在Nginx可以动态加载模块,无需编译整个Nginx

直接上Dockerfile吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
ARG version=1.17.6

FROM nginx:${version}-alpine AS builder

ARG version

WORKDIR /root/

RUN apk update && apk add --no-cache build-base git pcre-dev openssl-dev zlib-dev \
&& wget http://nginx.org/download/nginx-${version}.tar.gz \
&& tar zxf nginx-${version}.tar.gz \
&& git clone https://github.com/google/ngx_brotli.git \
&& cd ngx_brotli \
&& git submodule update --init --recursive \
&& cd ../nginx-${version} \
&& ./configure \
--add-dynamic-module=../ngx_brotli \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-perl_modules_path=/usr/lib/perl5/vendor_perl \
--user=nginx \
--group=nginx \
--with-compat \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
&& make modules


FROM nginx:${version}-alpine

ARG version

ENV TIME_ZONE=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

COPY --from=builder /root/nginx-${version}/objs/ngx_http_brotli_filter_module.so /usr/lib/nginx/modules/
COPY --from=builder /root/nginx-${version}/objs/ngx_http_brotli_static_module.so /usr/lib/nginx/modules/
阅读更多

用Python进行网易云和qq音乐歌单对比

由于网易云音乐版权越来越少,歌单里的歌一首首的灰掉,于是就想着换到qq音乐。但是用qq音乐导入网易云的歌单后还是有一部分歌没有匹配到,而qq音乐也没告诉你哪些没匹配到,人工一个个筛选实在不现实,所以就想用代码来解决这个问题。

初步打算根据歌曲名来筛选,首先就要获取到这两家的歌单数据

qq音乐

阅读更多

关于Golang随机数生成重复数字

最近在尝试用Golang写一个随机图API,但是关于随机数的生成产生了一些问题

原来的代码是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func findImage(s string) []byte {
imageList := make([]string, 0)
//遍历目录
err := filepath.Walk(s,
func(p string, f os.FileInfo, err error) error {
if f == nil {
return nil
}
if f.IsDir() {
return nil
}
ext := path.Ext(f.Name())
if ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" {
imageList = append(imageList, p)
}
return nil
})
if err != nil {
log.Fatal("in finding img ", err)
}
//返回随机图片
r := rand.New(rand.NewSource(time.Now().Unix()))
i := r.Intn(len(imageList))
img := imageList[i]
b, err := ioutil.ReadFile(img)
if err != nil {
log.Fatal("in opening img ", err)
}
return b
}
阅读更多