
目录
介绍
上次我们说了手动安装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、以及伪装站点的网页网页上传到远程目录,写一个个人用的一键脚本,从远程拉取文件部署容器即可。
参考文献:


