标签归档:网站加速

Ubuntu CentOS 7 源代码构建 Shadowsocks libev Servers

说明:本文相关配置和说明仅用于示例和操作指引,本站(任我乐)不对相关操作结果及由此产生的问题负责。

介绍:

Shadowsocks libev是目前唯一一个持续更新的版本,其他版本由于某些原因作者已经停止开发。Shadowsocks是一个轻量级的SOCKS5网络代理工具。与其他代理软件不同的是,Shadowsocks的流量被设计为从其他流量到第三方监控工具都难以分辨,并且能够将自己伪装成正常的直接连接。通过Shadowsocks传递的数据被加密,以提高安全性和隐私。

由于目前UbuntuCentOS没有Shadowsocks软件包,因此本指南将介绍如何从源代码构建Shadowsocks服务器。

说明:下面章节操作写了UbuntuCentOS的配置方案。本文概要说明在 CentOS 系统下的 Shadowsocks 配置。

1.安装 Shadowsocks-libev 服务器

项目地址://github.com/shadowsocks

更新系统存储库,下载并安装依赖扩展包:

CentOS 7.*:

$ yum update && yum upgrade -y
$ yum install epel-release -y
$ yum install -y gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto udns-devel libev-devel libsodium-devel mbedtls-devel git m2crypto c-ares-devel

Ubuntu 17.04:

$ apt-get update && apt-get upgrade -yuf
$ apt-get install -y --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libudns-dev automake libmbedtls-dev libsodium-dev git python-m2crypto c-ares-devel

在/mnt目录下载Shadowsocks Git模块:

$ cd /mnt
$ git clone //github.com/shadowsocks/shadowsocks-libev.git

Cloning into 'shadowsocks-libev'...
remote: Counting objects: 11147, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 11147 (delta 0), reused 3 (delta 0), pack-reused 11142
Receiving objects: 100% (11147/11147), 9.22 MiB | 71.00 KiB/s, done.
Resolving deltas: 100% (7305/7305), done.

$ cd shadowsocks-libev
$ git submodule update --init --recursive

开始安装:

$ ./autogen.sh
$ ./configure
$ make -j4 && make install

2.配置 Shadowsocks-libev 服务端

为 Shadowsocks 创建一个新的系统用户:

CentOS 7.*:

$ groupadd shadowsocks
$ useradd -g shadowsocks -s /bin/false shadowsocks

Ubuntu 17.04:

$ adduser --system --no-create-home --group shadowsocks

为配置文件创建一个新目录:

$ mkdir -m 755 /etc/shadowsocks-libev

创建Shadowsocks配置文件,将下面列出的内容粘贴到文件中:

$ vim /etc/shadowsocks-libev/shadowsocks.json

{
    "server":"My Server IP",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open": true
}

核心参数说明:

server:服务端监听地址(IPv4或IPv6)。
server_port:服务端端口,一般为443。
local_address:本地监听地址,缺省为127.0.0.1 可用-b参数设置。
local_port:本地监听端口,一般为1080。
password:用以加密的密匙。
timeout:超时时间(秒)。
method:加密方法。推荐使用AEAD算法。
fast_open:打开可以减少延迟。适用于系统内核kernel versions 3.7.1或更高版本。

3.优化 Shadowsocks libev 服务器

创建系统优化文件并将下面显示的内容粘贴到文件中。这些设置为Shadowsocks提供了最佳的内核配置。如果以前由于某种原因配置了系统内核设置,请确保不存在冲突。

$ vim /etc/sysctl.d/local.conf

fs.file-max = 51200
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.netdev_max_backlog = 4096
net.core.somaxconn = 4096

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1

net.ipv4.tcp_congestion_control = hybla

net.ipv4.tcp_congestion_control = cubic

可选:

建议开启BBR拥塞算法优化。请参阅《CentOS 7系统开启BBR拥塞算法优化TCP加速服务器网络》。

应用优化生效:

$ sysctl --system

4.创建一个Shadowsocks Systemd服务单元文件

Shadowsocks systemd服务允许守护进程在系统启动时自动启动并在后台运行。

$ vim /etc/systemd/system/shadowsocks.service

[Unit]
Description=Shadowsocks proxy server

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks-libev/shadowsocks.json -a shadowsocks -v start
ExecStop=/usr/local/bin/ss-server -c /etc/shadowsocks-libev/shadowsocks.json -a shadowsocks -v stop

[Install]
WantedBy=multi-user.target

加入开机自起并启动:

$ systemctl daemon-reload
$ systemctl enable shadowsocks
$ systemctl start shadowsocks

5.为 Shadowsocks 客户端打开防火墙端口

根据您的偏好,您可以使用iptablesUFWFirewallD命令来完成本节:

Iptables:

$ iptables -4 -A INPUT -p tcp --dport 8388 -m comment --comment "Shadowsocks server listen port" -j ACCEPT

UFW:

$ ufw allow proto tcp to 0.0.0.0/0 port 8388 comment "Shadowsocks server listen port"

FirewallD:

$ firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" port protocol="tcp" port="8388" accept'
$ firewall-cmd --reload

ShadowSocks-libev 的服务端到目前为止已经完成安装。

关于Shadowsocks客户端的使用这里不在叙述。

Nginx 1.3 集群负载均衡器 反向代理安装配置优化

什么是负载均衡?简言之:负载平衡是指通过一组后端服务器(也称为服务器集群或服务器池)有效地分发传入的网络流量。就像交通信号灯一样,横跨能够履行最大化速度和容量的利用率,确保没有任何一台服务器是超负荷状态,并在所有服务器上路由客户端请求。如果单个服务器关闭或出现故障则可能会降低性能,负载平衡器会将流量重定向到其余的在线服务器。当新的服务器被添加到服务器组时,负载均衡器会自动开始向其发送请求。

环境:
OS:CentOS Linux release 7.3.1611 (Core) x86_64
Web server:nginx version: nginx/1.13.3

10.10.204.62 Load Balancing
10.10.204.63 Nginx Web server
10.10.204.64 Nginx Web server
10.10.204.65 File Storage

1.Nginx Web server安装,我就不在叙述,请参阅《Nginx安装篇》。

2.分别修改4台服务器的主机名,一般都是IP地址,修改完成后重启服务器。

[root@localhost ~]# vim /etc/hostname

3.10.10.204.62 Load Balancing Nginx完整配置文件。注;观察红色部分;

[root@10-10-204-62 ~]# cat /usr/local/nginx/conf/nginx.conf
 user www www;
 worker_processes 1;

 #error_log logs/error.log;
 #error_log logs/error.log notice;
 #error_log logs/error.log info;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 65535;

events {
 use epoll;
 worker_connections 65535;
 }

http {
 include mime.types;
 default_type application/octet-stream;
 server_tokens off;
 #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 logs/access.log main;

 sendfile on;
 tcp_nopush on;

 server_names_hash_bucket_size 128;
 client_header_buffer_size 32k;
 large_client_header_buffers 4 32k;
 client_max_body_size 8m;
 tcp_nodelay on;
 keepalive_timeout 65;
 fastcgi_connect_timeout 300;
 fastcgi_send_timeout 300;
 fastcgi_read_timeout 300;
 fastcgi_buffer_size 64k;
 fastcgi_buffers 4 64k;
 fastcgi_busy_buffers_size 128k;
 fastcgi_temp_file_write_size 128k;

 gzip on;
 gzip_min_length 1100;
 gzip_buffers 4 16k;
 gzip_http_version 1.0;
 #gzip压缩的等级,0-9之间,数字越大,压缩率越高,但是cpu消耗也大。
 gzip_comp_level 9;
 gzip_types text/plain text/html text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
 gzip_vary on;
 #
 upstream webserverapps {
 ip_hash;
 server 10.10.204.63:8023 weight=1 max_fails=2 fail_timeout=2;
 server 10.10.204.64:8023 weight=1 max_fails=2 fail_timeout=2;
 #server 127.0.0.1:8080 backup;
 }
 server {
        listen 80;
        server_name www.myname.com myname.com;
 location / {
     proxy_pass //webserverapps;
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     client_max_body_size 10m;
     client_body_buffer_size 128k;
     proxy_connect_timeout 90;
     proxy_send_timeout 90;
     proxy_read_timeout 90;
     proxy_buffer_size 4k;
     proxy_buffers 4 32k;
     proxy_busy_buffers_size 64k;
     proxy_temp_file_write_size 64k;
     add_header Access-Control-Allow-Origin *;
       }
    }
 }

4.Nginx Web server 服务器配置:10.10.204.63 & 10.10.204.64。

server {
 listen 8989;
 server_name IP地址;
 location / {
 root /home/web/wwwroot/;
 index index.html index.htm index.php;
 #获取Client端IP需要Nginx支持http_realip_module模块
 set_real_ip_from 10.10.204.0/24;
 real_ip_header X-Real-IP;
     }
 }

5.Nginx做负载均衡需要用到 upstream 是Nginx的HTTP Upstream模块。

Nginx 的负载均衡 upstream 模块目前支持 6 种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权重值,Weight 值越大,分配到的访问机率越高。
ip_hash:每个用户请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。
fair:比上面两个更智能的负载均衡算法。此算法可以根据&加载时间的长短智能进行负载分配,根据后端服务器响应时长分配请求,响应时间越短就会优先分配。
url_hash:此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
least_conn:最少连接负载均衡算法,简单来说就是每次选择的后端都是当前最少连接的一个 server(这个最少连接不是共享的,是每个 worker 都有自己的一个数组进行记录后端 server 的连接数)。
hash:这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性 hash(consistent)。

6.在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的健康状态有:

down:表示当前的 server 暂时不参与负载均衡。
backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。
max_fails:允许请求失败的次数,默认为 1 。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。

注:当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 backup。

注:stream 是定义在 server{ } 之外,不能定义在 server{ } 内。定义好upstream后,用 proxy_pass 引用即可。此外每一次修改nginx.conf配置文件都需要重新加载Nginx服务。

7.关于 session 共享问题有更多解决方案,请继续参阅《Redis 缓存 PHP 7.2 session 变量共享》。

8.文件服务器

注意:其实大家可能会有个疑问,那么多服务器分布计算,他们需要的文件从哪里来,不仅要保证数据的一致性,还要保证数据的安全性。这个时候就要用到文件存储服务器了,只需要将10.10.204.65文件服务器的数据文件共享给 10.10.204.63 & 10.10.204.64 即可。通常由NFS网络文件系统完成文件共享,我这里已经安装完成。若你还没有安装,请参阅Nginx 集群负载均衡:NFS文件存储共享安装配置优化篇