目录
介绍
上次我们说了手动安装nginx部署ws+tls,详情见:纯手动安装nginx部署ws+tls并设置伪装网站,小白的v2ray是采用的docker版,那nginx是不是也可以采用docker版呢?当然也是可以的,今天我们就来看看如何通过纯docker的方式安装nginx部署ws+tls并搭建伪装网站。
实操
安装docker
wget -qO- get.docker.com | bash
安装v2ray
具体可参考:docker配合宝塔部署ws+tls并搭建伪装网站,这里我们采用秋水大佬的v2ray的docker镜像,下面简要描述
写入配置文件
vi /root/v2ay/config.json
,或者直接上传现成的config.json文件也可以。其中id和path请自己自定义,其中的端口和path要和接下来的nginx的配置文件中保持一致。
{ "inbounds": [ { "port": 29569, "protocol": "vless", "settings": { "clients": [ { "id": "f9950445-a796-454d-a2c7-9745dc2eb9e3" } ], "decryption": "none" }, "streamSettings": { "network": "ws", "security": "none", "tlsSettings": {}, "tcpSettings": {}, "kcpSettings": {}, "httpSettings": {}, "wsSettings": { "path": "/bueEnIYC/", "headers": { "Host": "" } }, "quicSettings": {} } } ], "outbounds": [ { "protocol": "freedom" } ] }
启动容器
docker run -d --network host --name v2ray --restart=always -v /root/v2ray:/etc/v2ray teddysun/v2ray
安装nginx
nginx的安装稍微复杂一点,也可以有稍微简单的方法,我们待会再说,先一步一步来。
启动一个临时容器
docker run -d --network host --name nginx nginx
nginx运行在docker容器中对应的目录如下:
配置文件目录:/etc/nginx;
日志目录:/var/log/nginx;
项目根目录:/usr/share/nginx/html;
了解nginx在docker中运行的目录地址是为了把他们给复制到宿主机的目录下。
复制容器nginx的配置文件到宿主机中
小白直接将容器的/etc/nginx目录映射到/root/nginx,我们直接把docker容器中的nginx配置复制进去。将/usr/share/nginx/html映射到/root/nginx/html。
docker cp nginx:/etc/nginx /root
停止之前启动的临时nginx容器,并删除
docker stop nginx docker rm nginx
修改配置文件并放入证书
备份原来的配置文件:
mv /root/nginx/nginx.conf /root/nginx/nginx.conf.bk
新建配置文件:
vi /root/nginx/nginx.conf
模板如下:
user root; worker_processes 1; #error_log /etc/nginx/error.log warn; #pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #access_log /etc/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 120; client_max_body_size 20m; #gzip on; server { # 服务器端口使用443,开启ssl, 这里ssl就是上面安装的ssl模块 listen 80; listen [::]:80 ipv6only=on; listen 443 ssl http2; listen [::]:443 ssl ipv6only=on http2; # 域名,多个以空格分开 server_name example.example.com; //请改成自己的域名 index index.php index.html index.htm default.php default.htm default.html; root /usr/share/nginx/html; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; #HTTP_TO_HTTPS_START if ($server_port !~ 443){ rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END ssl_certificate /etc/nginx/example.com.crt; ssl_certificate_key /etc/nginx/example.com.key; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END #ws反代部分,location路径和proxy_pass端口请与v2ray配置文件保持一致 location /bueEnIYC/ { if ($http_upgrade != "websocket") { return 404; } proxy_redirect off; proxy_pass http://127.0.0.1:29569; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; # Show real IP in v2ray access.log proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
启动新的nginx服务
docker run -d --network=host \ -e TZ="Asia/Shanghai" \ -v /root/nginx:/etc/nginx:ro \ -v /root/nginx/html:/usr/share/nginx/html:ro \ --name nginx --restart=unless-stopped \ nginx
:ro:表示容器内部的nginx文件是只读的,想要修改配置内容,只能修改宿主机的conf文件夹;这样带来的好处是安全性更高。
-e TZ=”Asia/Shanghai”:表示把时区设置为中国的时区;
拉取伪装站点
随便找个网页文件扔进宿主机的站点映射目录,可以去mack-a大佬的仓库里随便拖一个站点文件下来。
wget -O /root/nginx/html/web.zip https://github.com/mack-a/v2ray-agent/raw/master/fodder/blog/unable/html8.zip unzip web.zip
好了,大功告成。
构建个人一键脚本
有能力的童鞋可以自己封装docker镜像,小白不会,只能想到笨办法,这里提供一个思路。可以将v2ray的配置文件、从docker版nginx复制来的/etc/nginx目录压缩、适合自己的nginx.conf、以及伪装站点的网页网页上传到远程目录,写一个个人用的一键脚本,从远程拉取文件部署容器即可。
参考文献: