2019年11月

matokechi

这是对之前摸索的lnmp搭建流程的精简:
[post cid="317" /]
虽说是精简,但是文章还是有数万字的,请参看右侧目录点击导航需要的内容---->>>

一、初次登录安全设置


登录成功后,如果没开启密钥登陆的,本地用xshell生成密钥配对向导生成一对,公钥导出保存好,私钥自己更是要藏好了以免泄露
cd .ssh 文件夹下,ls看看是否有authorized_keys文件
没有相关文件夹和文件的话 mkdir,touch创建一下,并且记得sshd_config配置里面将key目录修改一致。(一般来说centos7不存在没有此路径的情况,默认配置证书路径应该也是统一的)
alt+ctrl+f 组合键打开sftp,上传本地的公钥.pub文件到 .ssh文件夹下,ls一下确保成功上传,然后写入公钥文件内容到authorized_keys文件内:

cat id_rsa_2048.pub >> /root/.ssh/authorized_keys

.pub公钥文件名请自行核对
公钥上传完毕,修改sshd配置:

vi /etc/ssh/sshd_config

主要两点:
1.关闭密码登录:PasswordAuthentication no
或者使用查找替换指令直接修改:

sed -i "s/^PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config

2.检查公钥文件路径:AuthorizedKeysFile .ssh/authorized_keys
就是这么简单,别的无关操作,比如关闭root登录(PermitRootLogin no),开启PubkeyAuthentication yes都不用管,没影响的
然后 systemctl restart sshd ,新开一个访问测试是否ok

二、lnmp配置环境安装流程


  • 1.安装Screen和Rclone

首先第三方epel源还有fuse等依赖都先安一遍,为了更舒适的安装体验:
yum -y install epel-release
安装Screen等基本工具
yum -y install wget unzip zip screen fuse fuse-devel

然后安装rclone,方便之后拉取备份网站数据:

wget https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
chmod 0755 ./rclone-*/rclone
cp ./rclone-*/rclone /usr/bin/
rm -rf ./rclone-*

安好后开启Screen并运行rclone配置:
screen -S install
rclone config
将你的网盘授权一下,参考文章:
[post cid="173" /]
附送一些基础的screen操作指令:
[collapse status="false" title="常用screen操作指令"]
几个常用操作熟练即可

screen -ls显示所有创建的桌面,未连接的桌面都显示Detached screen -r+桌面ID或者完整桌面名字 即可进入之前创建的对应ID桌面,再screen -ls就可以显示attached连接中了 在桌面链接中想退出当前桌面?按住 Ctrl +a+d即按着ctrl不放,再依次按一下a和d,就可以退出当前桌面了 screen -S 对应ID -X -quit强制关闭对应screen,ctrl+c通用停止当前指令操作

[/collapse]

  • 2.lnmp工作原理

lnmp工作原理

检查是否有添加了 FedoraProject 的 epel 源,之前我们已经安装
如果系统默认没有加入这个源,加入的方法很简单:

yum install epel-release

安装完成后执行

yum update
  • 3.nginx的安装

这里通过直接添加官方源后 yum 方式安装nginx。

添加nginx源文件配置 touch /etc/yum.repos.d/nginx.repo,编辑添加以下内容

vi /etc/yum.repos.d/nginx.repo

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/7/$basearch/

gpgcheck=0

enabled=1

(以上适用于 CentOS 7, 其他版本可以看官网说明)
nginx官方源地址

yum list |grep nginx

查询下配置源是否成功
然后安装 nginx执行:

yum -y install nginx

nginx启动并加入自启动:

systemctl start nginx
systemctl enable nginx

systemctl status nginx查看下运行状态
free -m查看下内存占用
这时候你的web服务就上线了,打开浏览器输入ip
即可看到nginx欢迎页面
如果没有,那就是你的vps默认开启防火墙了,先查看下吧:

firewall-cmd --state

我们添加http,https建站服务即可:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

再查看下就ok了

firewall-cmd --reload
firewall-cmd --list-all

如果firewalld无法启动尝试重启下dbus服务:

systemctl restart dbus
  • 4.安装 Mysql(MariaDB)

CentOS7 官方源中把 mysql 换成了 MariaDB,
因此我们这里以 MariaDB 代替 Mysql,首先执行安装:

yum install mariadb-server

安装完成后启动 MariaDB 并设置为开机启动:

systemctl start mariadb
systemctl enable mariadb

执行脚本通过交互的方式对 MariaDB 进行一些设置:

/usr/bin/mysql_secure_installation

一般来说全默认即可,每条设置内容大致说一下:
默认root用户访问第一次是留空密码;
提示是否设置密码,当然设置一个了,弄个复杂点的,自己小本本记录好;
root用户禁止远程访问,我们在后面将设置新的专用远程访问账号就好;
还有开放相关firewalld端口设置,如果需要外网访问数据库,就开启对应端口,防止3306之类的端口无法访问。

  • 5.安装php和相关扩展

[collapse status="false" title="默认版本php和相关扩展的安装方法"]
我们可以使用 yum 同样方便的安装 php-fpm,这里同时安装 php-mysql 扩展用于连接 mysql 数据库,如果你的 php 应用中需要用到更多的扩展,也可以在这里一并安装
附带安装一些必要的扩展

yum -y install php php-fpm php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel

以上就附带安装 PHP(php-fpm) 了

简单点,只安装下面2个也行:

yum install php-fpm php-mysql

[/collapse]

这里主要说下,如何安装php7.0以上版本:

  1. 清除历史版本

为了防止CentOS上面发生php冲突,所以,这个命令还是先执行一下更好些。

yum -y remove php*
  1. 安装源

安装php72w,是需要配置额外的yum源地址的,否则会报错不能找到相关软件包。
php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic。如果之前跳过epel-release源的话,安装webtatic的时候,会有错误抛出。
所以,这里再次提醒下,对应的源地址导入命令是:

rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

当然,您也可以选择之前的epel源安装命令,也是一样的效果:

yum install epel-release -y
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  1. 安装扩展包

事实上,这里面的对应扩展库很多,这里大家一定要注意cli和fpm mysqlnd这几个包,而其它的相关包就看您需要了。

yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysqlnd

还有比较豪华的版本:

yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml
  1. 安装完成以后,启动服务并加入自启动
systemctl start php-fpm.service
systemctl enable php-fpm.service

php-fpm的由来,nginx和php通信2种模式比较,参考:
https://blog.csdn.net/QFire/article/details/78680717?locationNum=1&fps=1

2020.11.18更新:
[collapse status="false" title="关于Centos 8系统安装php7.0以上版本"]

如果使用centos8系统 要安装php7.0以上版本,推荐使用dnf包管理器来替换rpm,我们添加remi源:

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

install remi repo
查看最新包含的php模块,没错,现在使用模块管理包了

dnf module list php

list php module

可以看到包括php7.0-8.0一些版本选择,这里安装7.4

dnf module enable php:remi-7.4

enable php-7.4 module

我们安装普通套件+自选的一些模块,mysqlnd是必须的,当然,你也可以选择自己需要的组合,或者默认的开发套件和最小化安装

dnf install php php-cli php-common php-devel php-embedded php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-xml

最后启动服务,添加开机自启:

systemctl enable php-fpm.service
systemctl start php-fpm.service

[/collapse]

  1. php配置的一些安全设置
vi /etc/php.ini

修改php默认配置:cgi.fix_pathinfo=0
你在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/”
然后输入你要查找的关键字 cgi.fix_pathinfo=敲回车(Enter键)就可以了。
如果你要继续查找此关键字,敲字符 n 就可以继续向下查找了。
敲字符N(大写N)就会返回向上查询
为了方便后面修改上传附件大小,提前修改下相关网站配置(如果你只是挂个空页面,保持php默认配置即可):

upload_max_filesize = 8000M;
post_max_size = 8000M;
max_execution_time=600;

修改php-fpm配置

vi /etc/php-fpm.d/www.conf

先展示下需要修改的列表清单:

listen= /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
user = nginx
group = nginx
pm = dynamic 生成动态进程
pm.max_children = 10 最大可以启动多少进程
pm.start_servers = 5 初始启动多少进程(默认数值推荐为最小备用+(最大备用-最小备用)/2)
pm.min_spare_servers = 2 最少备用的进程数
pm.max_spare_servers = 10 最大备用的进程数
pm.max_requests = 500 到达多少请求后自动结束进程
rlimit_files = 1024 一次请求的最大字节数

最后将php-fpm并加入自启动

systemctl enable php-fpm

重启nginx和php-fpm:

systemctl restart php-fpm
systemctl restart nginx

三、typecho的安装

1.获取typecho安装包

两种方式,直接wget解压拷贝,
或者本地电脑下载后上传到vps,看你网络和喜好了
1.1-17.10.30-release.tar.gz
附安装包分流,自己注意查毒安全
我们选择vps上直接wget安装,稳妥快捷一点:

cd /home/wwwroot/omo.moe
wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz

ls看看
1.1-17.10.30-release.tar.gz text
下载ok的话,解压:

tar -xzvf 1.1-17.10.30-release.tar.gz

x指extract提取出来
z解压含有gzip属性的文档
v可视化过程view
f指解压后文件夹以filename命名
ls一下,发现解压好了,生成一个新的build文件夹,里面就是安装目录了
我们拷贝到咱们需要建设的网站根目录下来

cp -R build/* ./

-Recursive 英[rɪˈkɜ:sɪv]递归传输build文件夹下所有内容,到当前目录 ./指当前目录 ../指上级目录。
如果你不习惯,或者没注意自己目前位置,可以用绝对路径:

cp -R /home/wwwroot/omo.moe/build/*  /home/wwwroot/omo.moe/

清理掉不需要的文件夹

rm -rf build/

同样的,新手慎用这个rm -rf,小心删库跑路,你可以直接xftp删对应文件夹。

2.配置网站数据库

我们可以设置一个typecho的数据库,下面是数据库的基本使用指令:

mysql -u root -p

输入安装lnmp时候你的root用户密码,如果之前留空,这里密码默认是root。
进入mysql后,素质三连:

CREATE DATABASE typecho_omo;
CREATE USER omo_admin@localhost IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON typecho_omo.* TO omo_admin@localhost IDENTIFIED BY 'password';

创一个叫typecho_omo的数据库,随你喜好取名,取个专用管理用户名omo_admin,自己改成喜欢的,
弄个密码,自己设置,改下password,别直接抄上面的。
注意数据库指令后面的分号。
最后刷新下这些改变和权限:

FLUSH PRIVILEGES;

附送:
[collapse status="false" title="Mysql修改用户密码指令"]
必须使用一个数据库

use typecho_omo;

update mysql.user set password=PASSWORD('new_password_here') where User='omo_admin';

'new_password_here'这里自己改下单引号里面的密码
刷新下权限

FLUSH PRIVILEGES;
exit;

[/collapse]

添加新站点配置:

find / -name nginx.conf

找到
查看配置

cat /etc/nginx/nginx.conf

里面是否包括下面这行,一般是有的,如果没有,则加上

include /etc/nginx/conf.d/*.conf;

然后在 /etc/nginx/conf.d/目录下,创建对应域名网站的配置文件,根据默认文件修改获得。

touch /etc/nginx/conf.d/omo.moe.conf

3.设定站点配置文件

如果正规做站,考虑上传附件限制,nginx咱们站点配置里可以在server location http任何一个框里加入:

client_max_body_size 8888m

[collapse status="false" title="站点配置文件和fast-cgi两种配置方案示例"]

server {
  listen 80;
  server_name omo.moe;
  listen [::]:80 default_server;#ipv6的放着无所谓,也可以注释掉
  root /home/wwwroot/omo.moe;#自己改成自己网站的路径
  index index.html index.htm index.php;
  #charset koi8-r;
  access_log /var/log/nginx/omo.moe.access.log main;#记住自己的log文件目录,也可自己设置

  location / {
    index index.html index.php;
    if (-f $request_filename/index.html) {
      rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php) {
      rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename) {
      rewrite (.*) /index.php;
    }
  }
  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }
  #不使用php内置解析,采用nginx正则解析pathinfo配置方案1
  #配置方案1 使用nginx模块fastcgi_split_path_info(nginx版本>0.7.31)
  location ~ \.php {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    #先加载默认后解析赋值
    include fastcgi_params;
    #正则解析路径
    fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  location ~ /.ht {
    deny all;
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 15d;
  }
  location ~ .*\.(js|css)?$ {
    expires 1d;
  }
}

#不使用php内置解析,采用nginx正则解析pathinfo配置方案2
#由于nginx内建只读变量$fastcgi_script_name无法赋值,所有通过设置$real_script_name变量来做中间值
location ~ \.php {
  try_files $uri =404;
  fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
  fastcgi_index index.php;
  #先加载默认后解析赋值
  include fastcgi_params;
  #正则解析路径
  set $path_info "";
  set $real_script_name $fastcgi_script_name;
  if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
    set $real_script_name $1;
    set $path_info $2;
  }
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param SCRIPT_NAME $real_script_name;
  fastcgi_param PATH_INFO $path_info;
}

[/collapse]
如果你已经拿到域名证书并准备全站启用https的话,可以直接参考成品配置如下:
[collapse status="false" title="https网站配置文件"]

server {
  listen 80;
  server_name www.omo.moe omo.moe;
  return 301 https://omo.moe$request_uri;#所有http网站请求跳转https://omo.moe
}

server {
  listen 443 ssl http2 default_server;
  server_name www.omo.moe;
  return 301 https://omo.moe$request_uri;#www网站跳转无www的
}
server {
  listen 80;
  listen [::]:80 default_server;
  root /home/wwwroot/omo.moe;
  index index.html index.htm index.php;
  #charset koi8-r;
  access_log /var/log/nginx/omo.moe.access.log main;

  listen 443 ssl http2 default_server;
  #ssl on; #新版本nginx无需此命令
  ssl_certificate "/usr/local/cert/omo_moe.crt";#证书路径自己改
  ssl_certificate_key "/usr/local/cert/omo_moe.key";#证书路径自己改
  ssl_session_timeout 10m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;

  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }
  client_max_body_size 8888m;#放宽网页主体大小限制,方便自己上传大文件。

  location / {
    index index.html index.php;
    if (-f $request_filename/index.html) {
      rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php) {
      rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename) {
      rewrite (.*) /index.php;
    }
  }
  location ~ \.php {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
  location ~ ^.+\.php {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  }
  location ~ /.ht {
    deny all;
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 15d;
  }
  location ~ .*\.(js|css)?$ {
    expires 1d;
  }
}

[/collapse]

这样我们可以直接通过rclone挂载的网盘恢复文件,如果你需要直接从旧站恢复数据,那么可以忽略后面的全新安装流程,这里演示一下:
[collapse status="false" title="通过已备份数据恢复站点流程,如果你是新建网站则跳过此流程"]

1.备份数据库和网站文件

如果你的旧站正在运行,我们先备份下相关文件,如果你也是用typecho的handsome新版主题,请登录你的后台管理关闭handsome插件后再进行备份操作:
使用zip指令压缩下网站用户文件备份至/home/Backup文件夹下:

zip -r /home/Backup/omo_moe_fileData_yy.mm.dd.zip /home/wwwroot/omo.moe/usr

root用户下使用 mysqldump备份对应数据库:

mysqldump -h localhost -u root -p typecho_omo > /home/Backup/omo_moe_yy.mm.dd.sql

然后rclone备份至Gdrive网盘:

rclone copy -v --stats 15s --bwlimit 40M /home/Backup/omo_moe_fileData_yy.mm.dd.zip GdriveBackup:Backup
rclone copy -v --stats 15s --bwlimit 40M /home/Backup/omo_moe_yy.mm.dd.sql GdriveBackup:Backup

不需要限速就去掉 --bwlimit 40M
注意zip文件压缩后包括完整的文件路径,即压缩包里面路径是:/home/wwwroot/omo.moe/usr

顺便可以做下网站内容增量备份:

rclone copy -v --stats 15s --bwlimit 40M /home/wwwroot/omo.moe/ GdriveBackup:Backup/omo.moe

这个因为Gdrive IO限制,小文件拷贝可能会比较慢,记得在screen里面挂着吧!
2.新站恢复数据流程

rclone下载Gdrive网盘中对应sql数据库文件和网站用户文件zip包:

rclone copy -v --stats 15s --bwlimit 40M GdriveBackup:Backup/omo_moe_fileData_yy.mm.dd.zip /home/Backup/
rclone copy -v --stats 15s --bwlimit 40M GdriveBackup:Backup/omo_moe_yy.mm.dd.sql /home/Backup/

解压导入网站用户文件以及mysqldump恢复数据库文件:
新站的mysql里面创建新的网站数据库:

mysql>create database typecho_omo;

新数据库名不需要和旧站一致

mysql>show databases;

看一下是否创建成功
我们将旧站数据导入新站的数据库里
首先使用新站的数据库:

mysql>use typecho_omo;
mysql>source /home/Backup/omo_moe_yy.mm.dd.sql;
mysql>show tables;

查看我们旧站的数据表是否全部导入成功:

typecho_contents表为例,查看下全部数据是否完整导入:

show full fields from typecho_contents;

查阅下文章内容,新旧数据库对比后检查数据条目是否一致:

select text from typecho_contents;

顺便可以查看下typecho_comments留言信息是否恢复正确:

show full fields from typecho_comments;
select text from typecho_comments;

注意,typecho后台管理员账号密码也是在这个数据库里面,所以新站的typecho后台管理员沿用这个。
数据库root用户和新建的typecho_omo数据库专用的博客管理用户typecho_admin,则是使用你新站之前刚创建的。

解压usr网站用户文件压缩包:

unzip omo_moe_fileData_yy.mm.dd.zip
\cp -rf /home/Backup/home/* /home

注意路径问题,如果路径没改变则覆盖当前usr默认文件,完毕后
新站就可以开始安装了
3.附:远程获取旧站mysql数据库文件方法

首先登录旧站数据库开启指定用户和指定远程ip(咱们新站的ip地址)访问当地数据库的权限:

grant all privileges on *.* to typecho_admin@'185.186.146.41' identified by "password"
flush privileges;
select host,user,password from user;

可以看见一条新的访问权限
如果要删除此授权,执行:

delete from mysql.user where user='typecho_admin' and host='185.186.146.41';

再切换到新站的ssh,ssh里面直接执行

mysqldump -h 103.79.76.41 -u typecho_admin -p typecho_omo > /home/test.sql

通过-h旧站ip,访问旧站的typecho数据库,> 指定数据库导出到本地的路径

[/collapse]
常用vi编辑指令:
gg回到页首,输入 :.,$d回车,清空文件

nginx -s reload或者 systemctl restart nginx重启下nginx。

4.网站域名解析设置

我们新建站点的话,上面的fast-cgi全新配置二选一设置完毕之后,去自己的域名服务商设置两条A解析
一个@头,ip填你的vps给的ip
一个www头,ip同上
等个2-10分钟,记录更新了就可以浏览器输入你自己的域名访问
如果不能访问,关闭你的SELinux:

setenforce 0

永久关闭则输入

sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

这样重启后也处于disabled状态。
现在就是图形化安装界面了,很简单的
修改项:
数据库默认地址localhost换成内网地址
127.0.0.1
如果你安装的是php7.0以上,请将数据库引擎改为Pdo_Mysql,其他和低版本php没区别数据库用户名,改成刚才设置的
omo_admin
数据库密码,为自己设置的密码
数据库名,刚才设置的:
typecho_omo

填好你的typecho后台管理员信息,提交即可
(如果出现无法创建config.inc.php文件,是因为/home/wwwroot/omo.moe文件夹owner属性权限没改,可以直接用

chown -R nginx:nginx /home/wwwroot/omo.moe

改过来,这里,我们在ssh里直接创建新的网站配置文件:

vi config.inc.php

查看下typecho网站配置文件位置

我们当前应该还在 /home/wwwroot/omo.moe目录下,不在的话,

cd /home/wwwroot/omo.moe/
vi config.inc.php

粘贴内容
保存
设置完毕后,应该就ok了
发个帖子上个图片测试看看吧!

一些小的设置:
如果之前你未做修改,这里再说一下:
修改上传图片大小限制

find / -name php.ini
vi /etc/php.ini

修改以下三项:

upload_max_filesize = 8000M;
post_max_size = 8000M;
max_execution_time=600;
systemctl restart php-fpm

nginx咱们站点配置里加一条,可以在server location http任何一个框里加入:

client_max_body_size 8888m

无法上传附件则改下用户组:

chown -R nginx:nginx /home/wwwroot/omo.moe

因为之前修改的listen监听用户和用户组是nginx:nignx
把网站所有文件改成nginx用户和nginx用户组,现在应该就可以了
如果你是军哥一键之类的脚本lnmp搭 wordpress,则应该改成www:www

至此,普通搭建就完毕了,接下来我们来申请证书,弄个https玩:

四、Https证书的申请和部署

1.nginx中启用https

第一步在服务器的nginx配置好ssl证书,并启用443端口,
vi /etc/nginx/conf.d/omo.moe.conf加入

listen  443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.omo.moe omo.moe;
root  /home/wwwroot/omo.moe;
ssl on;
ssl_certificate "/usr/local/cert/star.omo.moe.crt";
ssl_certificate_key "/usr/local/cert/star.omo.moe.key";
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

加在server 块内普通80端口监听配置下方即可
我们新建一个证书存放路径:

mkdir -p /usr/local/cert/

通过sftp 把证书.crt和自己的私钥.key文件传到这个位置

2.泛域名证书申请

证书申请用的野卡泛域名证书,先填写CSR申请表格,有在线的
https://csr.chinassl.net/generator-csr.html
填写参考:
CSR.png
注意域名前加上*.就是泛域名证书了,你的二级域名可以共用这个证书
注意邮箱要可用,勾选发送,申请信息会发到你的邮箱里
我收藏的两家收费的:
萌咖大佬的杂货铺
vip.cy

或者ssls.com,namecheap,namesilo之类的网站可能有正规的较实惠的证书搞活动价。
按提示申请alphassl 泛域名证书吧!

粘贴刚才邮件里获得的CSR信息,表头和结尾全复制过来
如果有谷歌验证,自行解决
如果你的域名 开启了whoisguard域名隐私保护,可以考虑关闭,不过这玩意要等生效很慢
所以推荐使用域名邮箱认证,免费的域名邮箱申请,阿里云和腾讯都有,百度一下,一般都是给
域名加3个解析:一个mx邮箱解析,一个txt文本指向,一个cname值
加好后,就可以成功获得你的域名对应邮箱后缀服务了
如果你使用office365 e3 MSDN订阅的域名邮箱服务,直接加一个新的成员,设置成需要的用户名,
比如admin@你的域名
webmaster@你的域名之类的
看下拉列表规则
然后自己写信测试看看是不是可用
可用后,就提交申请
等待验证你域名所有人的邮件到达,点击后确认申请信息无误
就确认
一般来说几分钟证书就下发成功了
根据邮件提示(打开邮箱查看),去alphassl网站复制一个通用的intermediate中间人证书
alphassl
与邮件末尾给你颁发的证书公钥部分(intermediate_domain_ca)组合一下,得到完整证书文件,改名为 你的域名.crt
再和你之前拿到的私钥.key文件,都命名ok,准备上传到vps使用

3.typecho后台配置

登录Typecho后台 -> 设置 -> 基本设置 -> 站点地址改成https的域名是必须的。
编辑Typecho站点根目录下的文件config.inc.php加入下面一行配置,否则网站后台还是会调用HTTP资源。

define('__TYPECHO_SECURE__',true);

4.全站开启Https访问的nginx配置完善

想要http连接全部跳转到Https的话,继续编辑nginx的配置文件:

vi /etc/nginx/conf.d/omo.moe.conf

开头新加一个server 对80端口,也就是http协议做return 301跳转:

server {
  listen 80;
  server_name www.omo.moe omo.moe;
  return 301 https://omo.moe$request_uri;
}

然后如有需要可以将https的www访问301跳转到无www的:

server {
listen 443 ssl http2 default_server;
server_name www.omo.moe;
return 301 https://omo.moe$request_uri;#www网站跳转无www的
}

[collapse status="false" title="这时候你的配置文件大概像这样子的"]

server {
listen 80;
server_name www.omo.moe omo.moe;
return 301 https://omo.moe$request_uri;#所有http网站请求跳转https://omo.moe
}

server {
listen 443 ssl http2 default_server;
server_name www.omo.moe;
return 301 https://omo.moe$request_uri;#www网站跳转无www的
}
server {
listen 80;
listen [::]:80 default_server;
root /home/wwwroot/omo.moe;
index index.html index.htm index.php;
#charset koi8-r;
access_log /var/log/nginx/omo.moe.access.log main;

listen 443 ssl http2 default_server;
#ssl on; #新版本nginx无需此命令
ssl_certificate "/usr/local/cert/omo_moe.crt";
ssl_certificate_key "/usr/local/cert/omo_moe.key";
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
client_max_body_size 8888m;

location / {
index index.html index.php;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php) {
rewrite (.*) $1/index.php;
}
if (!-f $request_filename) {
rewrite (.*) /index.php;
}
}
location ~ \.php {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ ^.+\.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
location ~ /.ht {
deny all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 15d;
}
location ~ .*\.(js|css)?$ {
expires 1d;
}
}

[/collapse]

重写下location ~ ./php{ 的伪静态规则,让文章页前面的index.php也隐藏起来:

location / {
index index.html index.php;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php) {
rewrite (.*) $1/index.php;
}
if (!-f $request_filename) {
rewrite (.*) /index.php;
}

替换之前的!e $request_filename段落,
再完善一下php文件的匹配规则:添加:

location ~ ^.+.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}

最后成品参考:
[collapse status="false" title="完整Https网站配置文档参考示例"]

server {
listen 80;
server_name www.omo.moe omo.moe;
return 301 https://omo.moe$request_uri;
}
server {
listen 443 ssl http2 default_server;
server_name www.omo.moe;
return 301 https://omo.moe$request_uri;
}
server {
listen 80;
listen [::]:80 default_server;
root /home/wwwroot/omo.moe;
index index.html index.htm index.php;
#charset koi8-r;
access_log /var/log/nginx/omo.moe.access.log main;

listen 443 ssl http2 default_server;
#ssl on;
ssl_certificate "/usr/local/cert/omo_moe.crt";
ssl_certificate_key "/usr/local/cert/omo_moe.key";
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
client_max_body_size 8888m;
location / {
index index.html index.php;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php) {
rewrite (.*) $1/index.php;
}
if (!-f $request_filename) {
rewrite (.*) /index.php;
}
}
location ~ \.php {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ ^.+\.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
location ~ /.ht {
deny all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 15d;
}
location ~ .*\.(js|css)?$ {
expires 1d;
}
}

[/collapse]

需要注意的是,原监听80端口的server框里,务必要有一个root 路径,以便那里面的location fastcgi_param
下的$document_root变量能获取到具体的路径,否则会导致
No input file specified.

设置好以后所有的http请求会重定向到https
可以测试下是否正确:

nginx -t

根据错误提示自行修正。
最后重启下:

nginx -s reload

新的配置就生效了,Https全站启动完成~

5.handsome主题的上传和插件启用

本地解压主题包handsome主题,整个主题文件夹上传到
/home/wwwroot/omo.moe/usr/themes
links插件上传到
/home/wwwroot/omo.moe/usr/plugins
然后登录typecho后台,设置links插件启用,应该就可以正式使用你的typecho博客了。

五、防火墙的基本配置使用

其实到目前为止,你的vps已经差不多设置完毕了,网站一般也没啥问题了,不过如果你想定制化你的防火墙,方便以后其他工具的安装和端口放行,那么可以熟悉下firewalld的使用:
咱们centos 7默认是安装了firewall的,如果你是centos6,喜欢iptables的请继续

firewall-cmd --state

查看状态,
没安装的直接安

yum install firewalld

安装的更新下:

yum update firewalld

先更新下firewalld到最新

firewalld的基本使用

启动: systemctl start firewalld
请注意,firewalld防火墙默认只启动22端口的ssh,你如果ssh端口改过了,请务必小心,
查看防火墙规则

firewall-cmd --list-all

会发现,在咱们默认的防火墙配置中仅开启了
services: ssh dhcpv6-client
ssh和dhcpv6-client两个服务,网站服务http 80端口
https 443端口是不可用的,
打开你的网站:
会提示502错误,无法访问的
别慌
我们添加http,https建站服务即可:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

再查看下就ok了

firewall-cmd --reload
firewall-cmd --list-all

查看状态: systemctl status firewalld
停止: systemctl disable firewalld
禁用: systemctl stop firewalld

最后
我们来演示下开启指定端口:

systemctl status firewalld
firewall-cmd --list-all
firewall-cmd --permanent --add-port=12345/tcp
firewall-cmd --permanent --add-port=12345/udp
firewall-cmd --reload
firewall-cmd --list-all

最后的最后,感谢您的查阅,希望能对您有所帮助!

_7.jpg
最近敌人的封锁越来越厉害了,普通的shadowsocks和shadowsocksr已经不堪重负,那么,通过建站博客tls加密流量通道进行伪装,算是目前的稳定选择了。

流量伪装思路介绍


这是本篇分享的原理介绍,大佬可以略过。
我们知道,普通的ss和ssr,墙是直接可以检测出来你的流量访问特征的,多次主动嗅探就可以得到所有加密伪装流量固定的特征字节,即便最新的AHEAD加密方式能防止主动嗅探,但是流量也是有它本身的特征的,所以只要发现可疑,还是会被咔嚓。
那么我们正常访问http和https网站,墙一般是不管你的,http是光着跑,没有加密,一眼可以判断你是否合规,而https流量特征tls也是显而易见的,和ss伪装的tls是有区别的,那么,我们通过tls也就是https来包装我们的翻墙服务流量,通过https访问我们的博客网站,根据客户端与服务器端指定的身份验证和指定的tls访问路径,来分流翻墙流量并识别翻墙身份验证,对进入服务器的tls流量包在服务器内部运行分流解密ss服务,就可以让外部嗅探看上去你在访问正常网站,实际上又能达到安全运送tls加密下的加密数据包(gcm或者chacha20-ploy1305之类的),在服务器内部通过v2ray或者ss解密,就不会被外部检测到了,相对来说,个人使用行为表现就更加隐蔽,至少从逻辑上来说,比头铁直接ss刚要稳定很多,但是频繁大量访问一个单页面或者不怎么出名的博客,在人类思维上,依然是不怎么对劲的,只能说在墙还未升级AI系统前,我们苦中作乐继续蹦跶几天是几天吧 ::aru:cryingface::
net transfer explain.png
而CDN服务商则是全球各种大型正规网站公用的服务,他们提供的DNS解析服务会隐藏网站的真实ip,你和网站的通信,在防火墙来看是直接与CDN服务商的DNS ip通信,这样目前情况没发生世界大战的话,不至于公开和CDN服务商发生恶劣关系,全部屏蔽(大局域网计划),所以理论上你的vps ip会更加可靠
OK,大致就是这么回事,网络非法外之地,翻出去只是为了学习,让自己更优秀,眼界更宽阔,未成年请在父母陪同下学习本教程。

1.nginx的网站conf配置分流翻墙流量


如何通过lnmp搭建typecho或者wordpress,自己可以百度查找,或者查看我的精简流程:
[post cid="601" /]
如果不太熟练的话,可以参考我的lnmp配置详细图文+视频流程(新手可能觉得太复杂或者耗费时间,你可以用宝塔):
[post cid="317" /]
网站服务成功运作后,编辑我们的nginx网站配置文件加点料:

vi /etc/nginx/conf.d/omo.moe.conf

添加对/omomoe路径的分流:

location /omomoe { # 与 V2Ray 配置中的 path 保持一致 ,通过v2ray客户端设置访问路径,通过接头地点初步认定身份 
    proxy_redirect off; 
    proxy_pass http://127.0.0.1:12345; # 这里按自己喜欢设定,匹配之后v2ray的监听地址从12345接收转发的流量
    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 -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

则ok,报错就按提示查看问题所在,一般都是格式小细节问题,修正好就行。

重启nginx:systemctl restart nginx
打开 https://omo.moe/omomoe提示400错误即Bad Request则说明分流生效,同时正常访问 https://omo.moe/则为普通的https站点,由于tls加密,外部也无法嗅探到你访问的网站具体路径,只知道连接到 https://omo.moe/而已。

  • Extra 额外的多台vps配置思路

如果你多台vps想通用一个域名,则修改server_name为二级域名即可,
你的域名服务商DNS解析新增一个A解析vps的ip到对应二级域名就可以了,但是记住你得配一个泛域名解析的证书,像我这样的
泛域名证书.png
泛域名多台VPS共用,此时nginx对接V2Ray配置示例:

server {
    listen 80;
    server_name jp1.omo.moe; #对应vps的网站服务域名新增对应二级域名即可   
    return 301 https://$server_name$request_uri;
}

域名服务商我这以namesilo为例,大概就是加这么一个A解析:
DNS.png
怎么申请泛域名证书,百度一下就行,或者参考文章开头我的lnmp搭建教程中的对应章节:
[post cid="321" /]
nginx这边的对接准备工作就算是完成了

2.V2ray服务端安装配置


在CentOS、Ubuntu等常用Linux系统上,直接执行如下命令安装V2Ray(如果已安装则更新程序):

bash <(curl -L -s https://install.direct/go.sh)

提示 curl: command not found ,那是因为你的 VPS 没装 Curl
centos 系统安装方法: yum update -y && yum install curl -y
安装后显示

Created symlink from /etc/systemd/system/multi-user.target.wants/v2ray.service to /etc/systemd/system/v2ray.service.
V2Ray v4.21.3 is installed.

安装完成后,编辑配置文件:vi /etc/v2ray/config.json
vi编辑之前可以先备份默认配置:

cp /etc/v2ray/config.json /etc/v2ray/config.jsonbak

清空默认配置,这里再介绍下vi的操作:按Esc进入命令模式输入 gg回到页首,然后输入 :.,$d清空原配置

修改需要监听来自nginx中的流量转发端口 port为12345,路径 path为nginx中的配置路径,即 /omomoe
这些你都可以自定义,虽然tls加密下,外部嗅探识别不到你是访问了/omomoe路径,但还是不建议你设置成 /ss/v2ray这类玩意
记下你的 id(即UUID),alterId一般默认为64新版本已经去掉此项,可暂时修改为0过渡)。
如需增加用户,UUID可以用这个网站生成:https://www.uuidgenerator.net
在clients[]数组内新增对应id和alterId配置即可
[collapse status="false" title="新增Clients示例"]

"clients": [
{
"id": "df1214db-f8d7-434f-b9c1-f5437e85376f", //用户A
"level": 1,
"alterId": 0
},//←←注意格式细节,这里新增一个逗号
{
"id": "h4adre34-bd3a-qq3d-c3de-dda334daf1b5c8", //用户B
"level": 1,
"alterId": 0
 }
]

[/collapse]

新增“streamSetting"配置在”inbounds”配置内:

"streamSettings": 
{
    "network": "ws", 
    "wsSettings": {
        "path": "/omomoe"
    }
}

一个完整示例:

[collapse status="false" title="完整V2Ray配置示例"]

{
    "log": {
        "loglevel": "warning", 
        "access": "/var/log/v2ray/access.log", 
        "error": "/var/log/v2ray/error.log"
    }, 
    "inbounds": [
        {
            "port": 12345, 
            "protocol": "vmess", 
            "settings": {
                "clients": [
                    {
                        "id": "df1214db-f8d7-434f-b9c1-f5437e85376f", 
                        "level": 1, 
                        "alterId": 0
                    }
                ]
            }, 
            "streamSettings": {
                "network": "ws", 
                "wsSettings": {
                    "path": "/omomoe"
                }
            }, 
            "listen": "127.0.0.1"
        }
    ], 
    "outbounds": [
        {
            "protocol": "freedom", 
            "settings": { }
        }, 
        {
            "protocol": "blackhole", 
            "settings": { }, 
            "tag": "blocked"
        }
    ], 
    "routing": {
        "rules": [
            {
                "type": "field", 
                "ip": [
                    "geoip:private"
                ], 
                "outboundTag": "blocked"
            }
        ]
    }
}

[/collapse]
注意新增streamSetting项目就需要将前面的settings项目补齐一个逗号,格式细节
如需阻止内网和局域网ip流量,routing路由还可以写入:

"routing": 
{
    "strategy": "rules", 
    "settings": {
        "rules": [
            {
                "type": "field", 
                "ip": [
                    "0.0.0.0/8", 
                    "10.0.0.0/8", 
                    "100.64.0.0/10", 
                    "127.0.0.0/8", 
                    "169.254.0.0/16", 
                    "172.16.0.0/12", 
                    "192.0.0.0/24", 
                    "192.0.2.0/24", 
                    "192.168.0.0/16", 
                    "198.18.0.0/15", 
                    "198.51.100.0/24", 
                    "203.0.113.0/24", 
                    "::1/128", 
                    "fc00::/7", 
                    "fe80::/10"
                ]
            }
        ]
    }
}

v2ray的JSON配置文件, 支持单行注释 //, 和多行注释 /* /*注意注释格式,否则可能出错,不放心可以全删了注释后复制粘贴。
保存重启v2ray服务:

systemctl restart v2ray

服务器端的配置就算是完成了,接下来是你本地客户端的配置

3.V2Ray客户端配置


如果是Json文件配置,则参考示例:

[collapse status="false" title="V2ray无面板Json配置示例"]

{
    "log": {
        "loglevel": "warning"
    }, 
    "inbound": {
        "port": 1080, 
        "listen": "127.0.0.1", 
        "protocol": "socks", 
        "settings": {
            "auth": "noauth", 
            "udp": true
        }
    }, 
    "inboundDetour": [
        {
            "port": 8128, 
            "listen": "127.0.0.1", 
            "protocol": "http", 
            "settings": { }
        }
    ], 
    "outbound": {
        "protocol": "vmess", 
        "settings": {
            "vnext": [
                {
                    "address": "omo.moe", 
                    "port": 443, 
                    "users": [
                        {
                            "id": "df1214db-f8d7-434f-b9c1-f5437e85376f", 
                            "level": 1, 
                            "alterId": 0, 
                            "security": "chacha20-ietf-poly1305"
                        }
                    ]
                }
            ]
        }, 
        "streamSettings": {
            "network": "ws", 
            "security": "tls", 
            "tlsSettings": {
                "serverName": "omo.moe"
            }, 
            "wsSettings": {
                "path": "/omomoe"
            }
        }, 
        "tag": "forgin"
    }, 
    "outboundDetour": [
        {
            "protocol": "freedom", 
            "settings": { }, 
            "tag": "direct"
        }
    ], 
    "routing": {
        "strategy": "rules", 
        "settings": {
            "rules": [
                {
                    "type": "field", 
                    "ip": [
                        "0.0.0.0/8", 
                        "10.0.0.0/8", 
                        "100.64.0.0/10", 
                        "127.0.0.0/8", 
                        "169.254.0.0/16", 
                        "172.16.0.0/12", 
                        "192.0.0.0/24", 
                        "192.0.2.0/24", 
                        "192.168.0.0/16", 
                        "198.18.0.0/15", 
                        "198.51.100.0/24", 
                        "203.0.113.0/24", 
                        "::1/128", 
                        "fc00::/7", 
                        "fe80::/10"
                    ], 
                    "outboundTag": "blocked"
                }
            ]
        }
    },
"policy": { "levels": { "0": {"uplinkOnly": 0} } } }
}

[/collapse]

加密模式选择aes-128-gcm或者chacha20-ietf-poly1305都行,都是最新的AHEAD验证加密,防止主动探测
当然了,为了操作方便,我们现在直接用V2RayN可视化界面就行,下载地址:
V2RayN等工具下载地址

配置示意:
[collapse status="false" title="配置示意"]
V2Ray客户端配置示例.png
[/collapse]

4.V2Ray自带流量统计简单应用


为了对接V2ray自带的流量统计api服务,我们需要在config配置文件加入以下内容

  1. "stats":{} 对象的存在
  2. "api" 配置对象里面有 StatsService
  3. "policy" 中的统计开关为 true,除了各个用户的统计,还有全局统计 clients 里面要有 email
  4. 专用的 dokodemo-door 协议的入口,tag 为 api
  5. routing 里面有 inboundTag:api -> outboundTag:api 的规则

当前版本默认v2ctl 服务端口为8080,我们就配置监听默认的8080端口即可。

[collapse status="false" title="一个简单的多用户流量统计配置示例"]

{
    "stats": { }, 
    "api": {
        "tag": "api", 
        "services": [
            "StatsService"
        ]
    }, 
    "policy": {
        "levels": {
            "0": {
                "statsUserUplink": true, 
                "statsUserDownlink": true
            }
        }, 
        "system": {
            "statsInboundUplink": true, 
            "statsInboundDownlink": true
        }
    }, 
    "inbounds": [
        {
            "port": 12345, 
            "protocol": "vmess", 
            "settings": {
                "clients": [
                    {
                        "email": "a@omo.moe", 
                        "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
                        "level": 0, 
                        "alterId": 0
                    }, 
                    {
                        "email": "b@omo.moe", 
                        "id": "yyyyyyyy-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
                        "level": 0, 
                        "alterId": 0
                    }, 
                    {
                        "email": "c@omo.moe", 
                        "id": "zzzzzzzz-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
                        "level": 0, 
                        "alterId": 0
                    }
                ]
            }, 
            "streamSettings": {
                "network": "ws", 
                "wsSettings": {
                    "path": "/omomoe"
                }
            }
        }, 
        {
            "listen": "127.0.0.1", 
            "port": 8080, 
            "protocol": "dokodemo-door", 
            "settings": {
                "address": "127.0.0.1"
            }, 
            "tag": "api"
        }
    ], 
    "outbounds": [
        {
            "protocol": "freedom", 
            "settings": { }
        }
    ], 
    "routing": {
        "settings": {
            "rules": [
                {
                    "inboundTag": [
                        "api"
                    ], 
                    "outboundTag": "api", 
                    "type": "field"
                }
            ]
        }, 
        "strategy": "rules"
    }
}

[/collapse]
以上配置我们简单分析下:
当有顶级 api 配置项时,V2Ray 会自动调用api.tag方法来寻找tag标记的路由策略
当执行v2ctl指令调用 API 请求发送 dokodemo-door 所监听的8080端口时,会按上述配置匹配inbound tag "api" --> outbound tag "api",所以 API 请求会从 dokodemo-door 通过"routing"路由配置输出到tag "api" outbound 中,从而实现所有发送到这个 outbound 的请求都会被当作 gRPC API 请求处理。
其中 dokodemo-door 的 settings.address 可以随便填,因为在做路由时只调用 inboundTag ,内部address只是格式书写。
执行/usr/bin/v2ray/v2ctl api -h 可以查看指令示例,我们这里随便举两条查询指令:

/usr/bin/v2ray/v2ctl api --server=127.0.0.1:8080 StatsService.QueryStats 'pattern: "" reset: false'查询流量数据
/usr/bin/v2ray/v2ctl api --server=127.0.0.1:8080 StatsService.GetStats 'name: "user>>>a@omo.moe>>>traffic>>>uplink" reset: false'查询指定用户流量

5.额外附送中转服务器按域名分发流量的服务器端配置文件


[collapse status="false" title="按域名分发流量,中转服务器配置文件"]

{
    "log": {
        "loglevel": "warning", 
        "access": "/var/log/v2ray/access.log", 
        "error": "/var/log/v2ray/error.log"
    }, 
    "inbound": {
        "listen": "127.0.0.1", 
        "port": 12345, 
        "protocol": "vmess", 
        "settings": {
            "udp": true, 
            "clients": [
                {
                    "id": "df1214db-f8d7-434f-b9c1-f5437e85376f", 
                    "alterId": 0
                }
            ]
        }, 
        "streamSettings": {
            "network": "ws", 
            "wsSettings": {
                "path": "/omomoe"
            }
        }
    }, 
    "outbound": {
        "protocol": "freedom", 
        "settings": { }
    }, 
    "inboundDetour": [ ], 
    "outboundDetour": [
        {
            "protocol": "blackhole", 
            "settings": { }, 
            "tag": "blocked"
        }, 
        {
            "protocol": "vmess", 
            "settings": {
                "vnext": [
                    {
                        "address": "18.177.126.131", 
                        "port": 443, 
                        "users": [
                            {
                                "id": "df1214db-f8d7-434f-b9c1-f5437e85376f", 
                                "level": 1, 
                                "alterId": 0, 
                                "security": "auto"
                            }
                        ]
                    }
                ]
            }, 
            "streamSettings": {
                "network": "ws", 
                "security": "tls", 
                "tlsSettings": {
                    "serverName": "jp.omo.moe"
                }, 
                "wsSettings": {
                    "path": "/omomoe"
                }
            }, 
            "tag": "aws"
        }
    ], 
    "routing": {
        "domainStrategy": "AsIs", 
        "strategy": "rules", 
        "rules": [
            {
                "type": "field", 
                "ip": [
                    "0.0.0.0/8", 
                    "10.0.0.0/8", 
                    "100.64.0.0/10", 
                    "127.0.0.0/8", 
                    "169.254.0.0/16", 
                    "172.16.0.0/12", 
                    "192.0.0.0/24", 
                    "192.0.2.0/24", 
                    "192.168.0.0/16", 
                    "198.18.0.0/15", 
                    "198.51.100.0/24", 
                    "203.0.113.0/24", 
                    "::1/128", 
                    "fc00::/7", 
                    "fe80::/10"
                ], 
                "outboundTag": "blocked"
            }, 
            {
                "type": "field", 
                "domain": [
                    "konachan.com", 
                    "yande.re", 
                    "konachan.net"
                ], 
                "outboundTag": "aws"
            }, 
            {
                "type": "field", 
                "ip": [
                    "91.108.4.0/22", 
                    "91.108.8.0/22", 
                    "91.108.12.0/22", 
                    "91.108.20.0/22", 
                    "91.108.36.0/22", 
                    "91.108.38.0/22", 
                    "91.108.56.0/22", 
                    "149.154.160.0/20", 
                    "149.154.164.0/22", 
                    "149.154.167.0/22", 
                    "149.154.172.0/22", 
                    "104.28.10.64", 
                    "104.28.11.64"
                ], 
                "outboundTag": "aws"
            }
        ]
    }
}

[/collapse]

主要功能就是在当前中转服务器(毛子gcore小鸡,无法访问telegraph和一些18x网站),
通过“outboundDetour”流量外发分流规则书写,标记对应的接收服务器(aws lightsail日本小鸡)并同时添加对应tag标签“aws",
最后在routing路由策略配置对应的路由规则“AsIs” 域名数组内符合的域名,
则分发流量到tag “aws”对应outboundDetour分发规则,完成毛子廉价小鸡完美上网体验

  1. 为啥要折腾毛子鸡中转? 答:便宜,88卢布一个月,500mbps口子,三网延迟100ms以内,性价比很好
  2. 为何不直接用aws lightsail? 答:aws jp 日常抽风,ijj线路电信爆炸
  3. 感觉太复杂,没学过json好难啊! 答:在今天之前,我也不知道json,甚至不知道v2ray可以转发路由,别自卑
  4. iptables,SNIproxy转发路由更方便啊,为什么不用? 答:SNIproxy可以转发成功tg,yande.re这些阻断网站,但是转发不了konachan这种跳转屏蔽网站,而且DNS转发总是有影响所有上网服务,同时两个v2ray服务器之间通信可靠性以及端口监听兼容性会有一些小问题,对于萌新来说,研究起来比v2ray来的更加复杂,还臃肿。用v2ray自带路由就能实现功能,而且可以不影响两个服务器的网站以及单独访问两台服务器的v2ray体验。
    Gcore的毛子鸡跑分示意图:
    GcoreLab家的88卢布小鸡
    特别感谢以下在线工具和教程分享:
    一个在线json格式排错工具
    一个在线json排版缩进美观格式化工具
    V2Ray链式转发的补充教程
    服务器按域名自动分流转发的配置问题
    配置文件启发于以上两位前行者的分享与研究成果,再次感谢~

6.如何套CDN,隐藏真实ip,更加隐蔽防检测,以CloudFlare为例


普通的v2ray+tls+websocket+nginx配置完毕,还是会检测你的真实ip,如果增加逻辑判断,以后依然会被智能识别,那么,我们将网站套上DNS解析,访问的时候,是直接和DNS服务器进行联系通信,而无法识别我们网站真实IP地址,考虑到DNS服务商全球各大网站都在使用,不到最后关头,DNS服务商的线路不会被阻断的
好了,套DNS其实很简单,我们以CloudFlare这家为例简单演示下:

  • 1、注册CloudFlare账号

打开CloudFlare,直接注册即可
选择左侧Free免费版即可:

choose plan.png

  • 2、添加域名

选择Add domain添加你的域名,这里以我的博客演示:omo.moe
添加完毕会识别当前的各种域名解析状况,如果没识别出来的,可以自己手动添加,我们将需要的那台vps对应的二级域名开启DNS代理即可,其他不需要DNS代理的二级域名点成灰色云朵,即代表只解析域名,不启动DNS代理服务,灰色就是裸奔,橙色就是流量走CloudFlare,很简单也很好理解:
DNS button.png

  • 3、修改域名的Name servers解析记录

跟着提示来,将原来域名服务商提供的解析改成CloudFlare的
name servers.png
以namesilo为例,找到服务商name servers record栏目,修改即可:
change record.png
改好后点击re-check或者一般过几分钟就可以了,最迟24小时内都会更新记录的。

  • 4、检查DNS是否成功开启

打开ping.pe
输入你的对应开启DNS解析的域名,查看ip是否是CloudFlare家的,即可确认
check result.png
DNS适合晚高峰炸裂的辣鸡线路,或者非常时期点一下橙色小云朵确保万无一失,很方便,平时裸奔万一ip被墙,上CF开启下解析,即可续命。
最后,如果觉得好用,可以随时在CF控制面板切换套餐,选择更高级的套餐,可能会有更好体验:
plan.png
或者找MJJ买以前免费就能获得的CF partner账号选择指定DNS解析ip,获得更好体验(市价目前400+,个人觉得一笑而过)
[collapse status="false" title="附送国内NAT VPS中转机器按用户分发到指定国外服务器的v2ray配置"]

{
"log": {
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbound": {
"listen": "127.0.0.1",
"port": 12345,
"protocol": "vmess",
"settings": {
"udp": true,
"clients": [
{
"id": "第一个用户的UUID", #自行修改
"email": "ru@a.com", #邮箱不需要真实的,是用来routing模块里匹配用户和对应outbound规则的
"level": 1,
"alterId": 0
},
{
"id": "第二个用户的UUID", #自行修改
"email": "jp@a.com",
"level": 1,
"alterId": 0
},
{
"id": "第三个用户的UUID", #自行修改
"email": "us@a.com",
"level": 1,
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/omomoe"
}
}
},
"outbound": {
"protocol": "freedom",
"settings": { }
},
"inboundDetour": [ ],
"outboundDetour": [
{
"protocol": "blackhole",
"settings": { },
"tag": "blocked"
},
//以下三块outbound分流规则,是指定对应三个国外服务器的分流,利用对应三个tag,和上面的user email匹配
    {
        "protocol": "vmess", 
        "settings": {
            "vnext": [
                {
                    "address": "92.38.128.170", 
                    "port": 443, 
                    "users": [
                        {
                            "id": "对应此国外服务器(RU)的用户UUID", 
                            "level": 1, 
                            "alterId": 0, 
                            "security": "auto"
                        }
                    ]
                }
            ]
        }, 
        "streamSettings": {
            "network": "ws", 
            "security": "tls", 
            "tlsSettings": {
                "serverName": "ru.omo.moe"
            }, 
            "wsSettings": {
                "path": "/omomoe"
            }
        }, 
        "tag": "ru"
    }, 
    {
        "protocol": "vmess", 
        "settings": {
            "vnext": [
                {
                    "address": "18.177.126.131", 
                    "port": 443, 
                    "users": [
                        {
                            "id": "对应此国外服务器(JP)的用户UUID", 
                            "level": 1, 
                            "alterId": 0, 
                            "security": "auto"
                        }
                    ]
                }
            ]
        }, 
        "streamSettings": {
            "network": "ws", 
            "security": "tls", 
            "tlsSettings": {
                "serverName": "jp.omo.moe"
            }, 
            "wsSettings": {
                "path": "/omomoe"
            }
        }, 
        "tag": "jp"
    }, 
    {
        "protocol": "vmess", 
        "settings": {
            "vnext": [
                {
                    "address": "107.172.103.59", 
                    "port": 443, 
                    "users": [
                        {
                            "id": "对应此国外服务器(US)的用户UUID", 
                            "level": 1, 
                            "alterId": 0, 
                            "security": "auto"
                        }
                    ]
                }
            ]
        }, 
        "streamSettings": {
            "network": "ws", 
            "security": "tls", 
            "tlsSettings": {
                "serverName": "us.omo.moe"
            }, 
            "wsSettings": {
                "path": "/omomoe"
            }
        }, 
        "tag": "us"
    }
], 
"routing": {
    "domainStrategy": "AsIs", 
    "strategy": "rules", 
    "rules": [
        {
            "type": "field", 
            "ip": [
                "0.0.0.0/8", 
                "10.0.0.0/8", 
                "100.64.0.0/10", 
                "127.0.0.0/8", 
                "169.254.0.0/16", 
                "172.16.0.0/12", 
                "192.0.0.0/24", 
                "192.0.2.0/24", 
                "192.168.0.0/16", 
                "198.18.0.0/15", 
                "198.51.100.0/24", 
                "203.0.113.0/24", 
                "::1/128", 
                "fc00::/7", 
                "fe80::/10"
            ], 
            "outboundTag": "blocked"
        }, 
//以下就是用户email一一对应相应的服务器tag,实现按用户名分发流量到指定服务器
{
"type": "field",
"user": [
"ru@a.com"
],
"outboundTag": "ru"
},
{
"type": "field",
"user": [
"jp@a.com"
],
"outboundTag": "jp"
},
{
"type": "field",
"user": [
"us@a.com"
],
"outboundTag": "us"
}
]
}
}

[/collapse]

2021.05.07更新:
新版本推荐将outboundDetour归入outbound,在此新增中转鸡按照用户email tag转发到落地鸡,以及转发到不同协议的不同落地鸡的分流,和按照域名,ip库设置分流策略的综合演示如下:
中转鸡常见分流规则
[collapse status="false" title="中转鸡常见分流规则"]

{
    "stats": {

    },
    "log": {
        "loglevel": "warning",
        "access": "/var/log/v2ray/access.log",
        "error": "/var/log/v2ray/error.log"
    },
    "api": {
        "tag": "api",
        "services": [
            "StatsService"
        ]
    },
    "policy": {
        "levels": {
            "0": {
                "statsUserUplink": true,
                "statsUserDownlink": true
            }
        },
        "system": {
            "statsInboundUplink": true,
            "statsInboundDownlink": true
        }
    },
    "inbounds": [{
            "port": 12345,
            "protocol": "vmess",
            "settings": {
                "clients": [{
                        "email": "a@omo.moe",
                        "id": "df1214db-f8d7-434f-b9c1-f5437e85376f",
                        "level": 0,
                        "alterId": 0
                    },
                    {
                        "email": "b@omo.moe",
                        "id": "df1214db-f8d7-434f-b9c1-0242ac130003",
                        "level": 0,
                        "alterId": 0
                    },
                    {
                        "email": "c@omo.moe",
                        "id": "f2e33002-f8d7-434f-b9c1-f5437e85376f",
                        "level": 0,
                        "alterId": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    "path": "/omomoe"
                }
            }
        },
        {
            "listen": "127.0.0.1",
            "port": 8080,
            "protocol": "dokodemo-door",
            "settings": {
                "address": "127.0.0.1"
            },
            "tag": "api"
        }
    ],
    "outbounds": [{
            "protocol": "freedom",
            "settings": {

            },
            "tag": "direct"
        },
        {
            "protocol": "vmess",
            "settings": {
                "vnext": [{
                    "address": "jjj.omo.moe",
                    "port": 12345,
                    "users": [{
                        "email": "b@omo.moe",
                        "id": "df1214db-f8d7-434f-b9c1-0242ac130003",
                        "level": 0,
                        "alterId": 0,
                        "security": "auto"
                    }]
                }]
            },
            "streamSettings": {
                "network": "ws",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "jjj.omo.moe"
                },
                "wsSettings": {
                    "path": "/omomoe"
                }
            },
            "tag": "hkt"
        },
        {
            "protocol": "shadowsocks",
            "settings": {
                "servers": [{
                    "address": "2.2.2.2",
                    "method": "aes-256-gcm",
                    "password": "mypassword",
                    "port": 1997,
                    "ota": false
                }]
            },
            "tag": "ss"
        }
    ],
    "routing": {
        "strategy": "rules",
        "settings": {
            "domainStrategy": "IPOnDemand",
            "rules": [{
                    "type": "field",
                    "outboundTag": "direct",
                    "domain": [
                        "geosite:cn"
                    ]
                },
                {
                    "type": "field",
                    "outboundTag": "direct",
                    "ip": [
                        "geoip:cn",
                        "geoip:private"
                    ]
                },
                {
                    "type": "field",
                    "user": [
                        "b@omo.moe"
                    ],
                    "outboundTag": "hkt"
                },
                {
                    "type": "field",
                    "domain": [
                        "xx.cn"
                    ],
                    "outboundTag": "ss"
                },
                {
                    "inboundTag": [
                        "api"
                    ],
                    "outboundTag": "api",
                    "type": "field"
                }
            ]
        }
    }
}

[/collapse]

有人说这么折腾有啥用,用处就是可以实现晚高峰电信看youtube 4k高清:
CN-RU.jpg
让电信测速也自信起来:
CN-RU_speedtest.jpgCN-US_speedtest.jpg
对应国内联通NAT中转机器,win客户端配置参考图:
CN-RU_client.jpg
无需GIA线路,成本:
国内联通NAT机器,20+rmb,国外任意毛子鸡10rmb左右,aws lightsail日本5rmb左右,辣鸡美西线路,5-10刀年付
你就可以让三网获得联通晚高峰舒适体验,让电信移动都感受到丝般润滑,同时救活你的辣鸡lightsail,你的pacificrack,你的virmach,让流量烧起来。
NAT机器DDNS配置参考[post cid="658" /]
[/collapse]