标签 centos 下的文章

好久不在贵行混,殊不知原先那套 LAMP 或 LNMP 的架构早已奥特且随着岁月流逝慢慢发生了升级与变迁。

这次要玩的是一套提供前端服务的架构。大致交代一下故事背景:

1、负载机绑定了 1 个公网 IP 与 1 个私网 IP(VIP地址、私网 IP 漂移、HAProxy 高可用啥的需要运营商配合,正在准备,以后玩过了再写),部署 Nginx 用于反向代理;
2、前端服务所在主机与负载机在同一私网网段内。

好了,故事开始。

首先部署完负载机的 Nginx 服务,用于监听负载机的 TCP 80 及 443 端口。值得注意的是若使用源码编译方式安装 Nginx,记得添加:

--with-http_ssl_module --with-http_realip_module

其实直接 yum 也阔以。安装后对配置文件 nginx.conf 进行调整:

user www www;
worker_processes auto;
error_log /path/to/logs/error.log;
pid /path/to/logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
    use epoll;
    worker_connections 65535;
}
http {
    include mime.types;
    default_type application/octet-stream;
    include /usr/local/nginx/conf/reverse-proxy.conf;
    sendfile on;
    keepalive_timeout 65;
    gzip on;
    client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
    client_body_buffer_size 256k;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
    proxy_send_timeout 300s;
    proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
    proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
    proxy_ignore_client_abort on; #不允许代理端主动关闭连接
    server {
        listen 80;
        server_name _;
        location / {
            root html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

记得打开防火墙端口,若还有上级网络安全策略等,更新配置。

前端机 Web 服务因人而异了,这里假定还是由 Nginx 提供前端服务,部署过程略,监听前端机的 TCP 80 端口。值得注意的是需要在 Nginx 配置文件中定义日志格式:

log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $HTTP_X_Forwarded_For';
 
access_log /path/to/logs/access.log access;

在负载机上编辑反向代理的配置文件:

vim /usr/local/nginx/conf/reverse-proxy.conf

若有多个 server 可再行扩展:

server
{
    listen 80;
    server_name sub.domain.com;
    location / {
        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;
        proxy_pass http://192.168.x.x;
    }
    access_log /path/to/logs/sub.domain.com_access.log;
}

截至目前,http 协议的转发已经完成。域名解析完成且生效后,访问应该会从负载机走私网定向到前端机。看了一圈日志没问题后,继续折腾 https。

SSL 证书提供商毫无疑问是 Let's Encrypt。据我所知有 certbot-auto 与 acme.sh 两种方式来实现证书自动申请与续展,前者貌似只能支持单个域名,而后者目前已支持泛域名证书。因此我选择后者。

配置过程就不展开了,中文版引导在这里。值得注意的是,若使用 certbot-auto,则需要修改负载机 Nginx 的反向代理配置文件,将 .well-known 目录指向本地:

server {
    listen 80;
    server_name sub.domain.com;
    […]
    location /.well-known {
            alias /path/to/sub.domain.com/.well-known;
    }

    location / {
        # proxy commands go here
        […]
    }
}

若使用 acme.sh,则既可通过 .well-known 目录来验证,也可通过 DNS 解析来验证(需提前向域名注册商申请 API)。可参考这里

好了,到这里,证书更新的事儿也是自动的。

去喝杯咖啡吧~

Update:

已实现客户端到负载机的访问是公网 https,负载机转发到前端机走私网 http。已遇到一个问题,最新版的 phpMyAdmin 会提示:

服务器和客户端上指示的 HTTPS 之间不匹配。这可能导致 phpMyAdmin 无法正常工作或存在安全风险。请修复您的服务器配置以正确指示 HTTPS。

嗯~有待进一步解决。

Update:

上述问题解决方案:在 phpMyAdmin 的配置文件中添加:

$cfg['PmaAbsoluteUri'] = 'https://pma.xxx.com';

即可。

还是那堆联通云机,交付前 LVM 也不给搞好,云盘默认也不挂载,特别吐槽一下。怀念某云的傻瓜式服务,前者到底是国有,揍是硬气。

这是扩容前的情况:

[root@centos7 ~]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/rootvg-rootlv   10G   10G   20K 100% /
devtmpfs                   3.9G     0  3.9G   0% /dev
tmpfs                      3.9G     0  3.9G   0% /dev/shm
tmpfs                      3.9G  369M  3.5G  10% /run
tmpfs                      3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda1                  485M  166M  319M  35% /boot
tmpfs                      783M     0  783M   0% /run/user/0

用 vgs 和 lvs 看一下可用空间,并根据实际情况构造如下命令:

[root@centos7 ~]# lvresize -L +37.51G /dev/rootvg/rootlv
  Rounding size to boundary between physical extents: 37.51 GiB.
  Size of logical volume rootvg/rootlv changed from 10.00 GiB (2560 extents) to 47.51 GiB (12163 extents).
  Logical volume rootvg/rootlv successfully resized.

最后同步一下文件系统就搞定了:

[root@centos7 ~]# xfs_growfs /dev/rootvg/rootlv
meta-data=/dev/mapper/rootvg-rootlv isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2621440 to 12454912

验证:

[root@centos7 ~]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/rootvg-rootlv   48G  9.8G   38G  21% /
devtmpfs                   3.9G     0  3.9G   0% /dev
tmpfs                      3.9G     0  3.9G   0% /dev/shm
tmpfs                      3.9G  369M  3.5G  10% /run
tmpfs                      3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda1                  485M  166M  319M  35% /boot
tmpfs                      783M     0  783M   0% /run/user/0

自己马克一下。

最近接手了一堆联通 IDC 的云主机(数量真的很多),也分配了云盘资源。看了一下需要手动挂载,对于懒癌重度患者亟须解放劳动力。

以下是笔记。

首先确认云盘资源是否已分配关联:

[root@centos7 ~]# fdisk -l

结果:

磁盘 /dev/vda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d3443

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     1001471      499712   83  Linux
/dev/vda2         1001472   104857599    51928064   8e  Linux LVM

磁盘 /dev/vdb:429.5 GB, 429496729600 字节,838860800 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/mapper/rootvg-rootlv:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/mapper/rootvg-swaplv:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

因此确定云盘设备路径为:

/dev/vdb

初始化:

[root@centos7 ~]# fdisk /dev/vdb

可按需进行分区,我这边只设置一个主分区。

接着以 ext4 格式对其进行格式化:

[root@centos7 ~]# mkfs.ext4 /dev/vdb

其结果:

mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
26214400 inodes, 104857600 blocks
5242880 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2252341248
3200 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

下一步对其进行手动挂载:

[root@centos7 ~]# mkdir /data
[root@centos7 ~]# mount /dev/vdb /data

行了,看看是否挂载正确:

[root@centos7 ~]# df -h

没问题的话,最后配置自动挂载:

[root@centos7 ~]# vim /etc/fstab

在文件最后添加一行:

/dev/vdb /data ext4 defaults 0 0

连在一起就是:

#!/bin/bash
fdisk /dev/vdb <<EOF
n
p
1


wq
EOF

mkfs.ext4 /dev/vdb &&  mkdir /data && mount /dev/vdb /data
echo '/dev/vdb /data ext4 defaults 0 0' >> /etc/fstab

然后用 pssh 之类的,哗啦一下都搞定。

- EOF -

本博自 2012 年光荣地被 GFW 认证后,长期流亡海外。辗转香港、日本、美国等地,依然在高墙之外。2014 年的时候,眼看我的域名邮箱都收不到来自墙内的邮件,再也坐不住了。后来通过一些技术方式调整了部署,邮箱恢复正常,本博也终于得见天日。

三年多的时间发生了什么?我不能告诉你。只能说我也做了很多事情,唯一值得庆幸的是,我终于离开了互联网行业。这种感觉也正如同围城效应,现在反思前后,居然还有些许不舍。再值得庆幸的是,互联网就在我们身边。你玩儿,或者不玩儿,Ta 都在这里。每时每刻、不离不弃。

最近又遇到一件事情让我重操旧业。作为重度 Google 用户,已经具备常年与 GFW 作斗争的经验。然而在各种两会各种峰会的轮番轰炸下,梯子一个一个倒下去。SSH 转 Socks5 的方式早已落伍,各种 VPN 服务也在挣扎。为了能够更愉快地玩耍,我决定自食其力。

首先要有一台墙外的服务器或者 VPS。现在阿里云、腾讯云等各种云都做得不错,价格也亲民(我用的不是上述服务商,别问为什么,谢谢)。操作系统 CentOS,开始:

检查内核环境是否包含 mppe,是否支持 pptp。CentOS 6.4 内核版本在 2.6.15 以上,都已默认集成。

cat /dev/ppp
cat /dev/net/tun

安装 ppp、防火墙与 pptpd:

yum install -y ppp iptables
wget -c http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm
rpm -Uhv pptpd-1.4.0-1.el6.x86_64.rpm
yum install pptpd

修改配置文件中的 DNS 为 8.8.8.8 和 8.8.4.4:

vi /etc/ppp/options.pptpd

配置 VPN 账户:

vi /etc/ppp/chap-secrets

配置客户端分配到内网的 IP 地址,记得在最后加一个空行。

vi /etc/pptpd.conf

修改 net.ipv4.ip_forward 为 1:

vi /etc/sysctl.conf

生效配置,启动防火墙服务:

/sbin/sysctl -p
/sbin/service iptables start

根据网卡参数配置防火墙。由于我的 VPS 有两个公网 IP,就这样:
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j SNAT --to-source xx.xx.xx.xx
/sbin/iptables -t nat -A POSTROUTING -o eth1:1 -s 192.168.0.0/24 -j SNAT --to-source x.x.x.x

保存设置,重启服务:

/etc/init.d/iptables save
/sbin/service iptables restart

最后重启 pptpd 就大功告成了:

service pptpd restart

还可以设置开机启动:

chkconfig pptpd on
chkconfig iptables on

参考文章《centos6.4安装搭建pptp vpn服务(附pptp vpn 一键安装包) | 大步's Blog》,原文作者:大步。原链接已失效。

从今天开始,妈妈再也不用担心我的学习。家中小米路由以及单位极路由完美适配。其中极路由本身有智能路由模式,小米路由需要刷开发包,开启 SSH。具体可参见《正确姿势使用智能VPN分流,无缝国内外分流科学上网》。

- 阅读剩余部分 -