Centos 6 x86 minimal 部署

前言

一直用着阿里云 ECS ,说实话确实挺好的,只可惜太贵了,而且在国内很多事情做不了。最近在找国外的 VPS,最终选择了搬瓦工。以前一直用 Ubuntu,搬瓦工默认安装了32位 Centos 6,果断重装系统选择 minimal 版,小巧、纯净、安装快、启动快、适合作自动部署。接下来需要快速部署服务器让它运作起来。

更改 SSH 密码

缘由

默认的随机密码记不住,也懒得保存,干脆就改掉它吧,至少在做免密登录前不用一直拷贝粘贴那么麻烦。

更改

用 root 用户登录后,敲 passwd 命令。

1
$ passwd

然后敲两遍新密码即可。

1
2
3
4
更改用户 root 的密码 。
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。

更改 SSH 端口

缘由

出于安全考虑,搬瓦工 vps 的 SSH 默认端口不是22,而是一个随机数,例如28766。如果不改回22,用 ssh 连服务器或者 scp 传文件的命令都要加上 -p 28766 或 -P 28766,虽然可以用 alias 来解决这个问题,但还是有点烦。

更改

  • 更改配置文件

修改 ssh 服务配置文件,路径一般是/etc/ssh/sshd_config

1
$ vi /etc/ssh/sshd_config

Centos 6 x86 minimal 上默认没有 vim,只有 vi。

翻到最下面,将 Port 改为 22。

1
2
PermitRootLogin yes
Port 22
  • 重启 sshd 服务
1
$ service sshd restart

刷新 kiwivm 管理面板,已经可以看到 SSH Port 改为 22。

SSH 免密登录

缘由

每次登录自己的 VPS 还要输入密码,很麻烦,通过配置公钥来让自己免密登录服务器。每次都敲 ssh 命令也有点烦,结合 alias 实现快捷免密登录

配置

  • 在本地生成公钥/私钥对,如果已经生成过了可以忽略。

    1
    $ ssh-keygen -t rsa -P ''

    -P 表示密码,-P ‘’ 就表示空密码,也可以不用 -P 参数,这样就要三次回车,用 -P 就一次回车。

    按 Command + Shift + H 可以进到个人文件夹,会生成 .ssh文件夹,里面有私钥id_rsa和公钥id_rsa.pub

  • 服务器上修改 SSH 配置文件

    1
    $ vi /etc/ssh/sshd_config

    找到下面三行并将每行开头的注释#去掉

    1
    2
    3
    #RSAAuthentication yes
    #PubkeyAuthentication yes
    #AuthorizedKeysFile .ssh/authorized_keys
  • 在服务器上新建.ssh 目录

    1
    $ mkdir .ssh
  • 把本地的公钥id_rsa.pub复制到服务器上的.ssh

    1
    $ scp /Users/bingo/.ssh/id_rsa.pub root@blog.bingo.ren:/root/.ssh/
  • 服务器上把公钥添加到.ssh/authorized_keys文件里

    1
    $ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
  • 授权

    1
    2
    $ chmod 700 /root/.ssh
    $ chmod 600 /root/.ssh/authorized_keys
  • 重启 sshd

    1
    $ service sshd restart

免密登录

1
2
3
$ ssh root@blog.bingo.ren
The authenticity of host 'blog.bingo.ren (45.78.46.239)' can't be established.
RSA key fingerprint is SHA256:YPO7cW9V0UXbVapNs3wh47JrpkolJWPNJUBFd9p2s64.

敲 yes 回车,以后就可以免密登录了。

alias 快捷登录

按 Command + Shift + H 进入个人目录,找到 .bashrc,如果没有则先创建,然后添加一行:

1
alias vps='ssh root@45.78.46.239'

如果在同个目录下没有 .bash_profile 文件,则创建它,然后添加一行:

1
source ~/.bashrc

最后在终端执行即可

1
$ source ~/.bashrc

vps 就是 ‘ssh root@45.78.46.239’ 的别名,以后在终端直接敲 vps 回车,跟敲 ssh root@45.78.46.239 然后回车的效果是一样的。

结合前面配置公钥实现的免密登录,实现了 ssh 快捷免密登录服务器

安装环境

选择

根据需要安装环境,有四种组合模式。

组合模式 说明
LNMP 安装Nginx,不安装Apache、Tomcat(系统运行php-fpm进程)
LAMP 不安装Nginx、Tomcat,安装Apache(无php-fpm进程,php以模块形式加载在Apache中)
LNMPA 安装Nginx、Apache、不安装Tomcat(该模式下,静态资源由Nginx处理,PHP由Apache处理,无php-fpm进程,php以模块形式加载在Apache中)
LNMT 安装Nginx和Tomcat,不安装Apache(该模式下,静态资源由Nginx处理,JAVA由Tomcat处理,可安装PHP,支持多语言环境,同时运行php、java)
  • PHP 用户推荐使用 LNMP 模式
  • JAVA 用户推荐使用 LNMT 模式
  • PHP + JAVA 用户使用 LNMT 模式

什么?你在问我为什么不用 Apache?党派之争,请自行百度谷歌,我简单说一下个人的观点,Nginx 是事件驱动,轻量级,抗并发;而 Apache 相比之下为了稳定耗了太多内存,这在低配的服务器上是无法忍受的。

我的标准:

  • 有一定量的并发需求的时候,服务器配置内存低的用 Nginx,内存几十个G的用 Apache。
  • 静态请求多的用 Nginx,动态请求多的用 Apache。

结合我的标准,由于我的 vps 配置较低,暂时放的静态文件会较多比如个人博客,再加上我是 Java 用户,LNMT 是我的唯一选择,静态用 Nginx 处理,动态用 Tomcat 处理。

假设你是一名 PHP 用户,请参考以下两篇文章。

第二篇是国内最早详细介绍 Nginx + PHP 的文章, 作者从2007年的第1版,一直更新到2010年的第6版。我不知道现在为什么还有 PHP 开发人员没听过 FastCGI,不知道 php-fpm 进程。也罢,等某天我想转 PHP 了再去捣鼓这些问题吧。

安装

  • 安装 Screen

    • CentOS / Redhat

      1
      $ yum -y install wget screen curl python
    • Debian / Ubuntu

      1
      $ apt-get -y install wget screen curl python
  • 下载 oneinstack

    • 阿里云用户下载

      1
      $ wget http://aliyun-oss.linuxeye.com/oneinstack-full.tar.gz
    • 包含源码,国内外均可下载

      1
      $ wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz
    • 不包含源码,建议仅国外主机下载

      1
      $ wget http://mirrors.linuxeye.com/oneinstack.tar.gz
  • 解压 oneinstack

1
$ tar xzf oneinstack.tar.gz
  • 开始安装
1
2
3
$ cd oneinstack
$ screen -S oneinstack
$ ./install.sh

如果网路出现中断,可以执行命令screen -r oneinstack重新连接安装窗口。

出现这个界面就正式开始安装组件了。

1
2
3
4
5
6
#######################################################################
# OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+ #
# For more information please visit https://oneinstack.com #
#######################################################################
Please input SSH port(Default: 22):

SSH 端口,默认22,前面已经将端口改为22了,可以直接回车。接下去根据前面选择好的组合模式进行选择即可,下面是我安装 LNMT 的组合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Do you want to install Web server? [y/n]: y
Please select Nginx server:
1. Install Nginx
2. Install Tengine
3. Install OpenResty
4. Do not install
Please input a number:(Default 1 press Enter) 1
Please select Apache server:
1. Install Apache-2.4
2. Install Apache-2.2
3. Do not install
Please input a number:(Default 3 press Enter) 3
Please select tomcat server:
1. Install Tomcat-8
2. Install Tomcat-7
3. Install Tomcat-6
4. Do not install
Please input a number:(Default 4 press Enter) 1
Please select JDK version:
1. Install JDK-1.8
2. Install JDK-1.7
Please input a number:(Default 2 press Enter) 1
Do you want to install Database? [y/n]: y
Please select a version of the Database:
1. Install MySQL-5.7
2. Install MySQL-5.6
3. Install MySQL-5.5
4. Install MariaDB-10.1
5. Install MariaDB-10.0
6. Install MariaDB-5.5
7. Install Percona-5.7
8. Install Percona-5.6
9. Install Percona-5.5
10. Install AliSQL-5.6
Please input a number:(Default 2 press Enter) 1
Please input the root password of database: xxxxxx
Please choose installation of the database:
1. Install database from binary package.
2. Install database from source package.
Please input a number:(Default 1 press Enter) 1
Do you want to install PHP? [y/n]: n
Do you want to install Pure-FTPd? [y/n]: y
Do you want to install redis? [y/n]: y
Do you want to install memcached? [y/n]: y
Do you want to install HHVM? [y/n]: n

到这里为止,人工操作就结束了,接下来就等脚本自动安装完毕。

安装完成会显示安装信息,最好拷贝保存起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
####################Congratulations########################
Total OneinStack Install Time: 11 minutes
Nginx install dir: /usr/local/nginx
Tomcat install dir: /usr/local/tomcat
Database install dir: /usr/local/mysql
Database data dir: /data/mysql
Database user: root
Database password: xxxxxx
Pure-FTPd install dir: /usr/local/pureftpd
Create FTP virtual script: ./pureftpd_vhost.sh
redis install dir: /usr/local/redis
memcached install dir: /usr/local/memcached
index url: http://45.78.46.239/
Please restart the server and see if the services start up fine.
Do you want to restart OS ? [y/n]: y

重启完成,环境就安装完毕了。

更改防火墙

查看防火墙状态

1
$ service iptables status

可以看到过滤器里只允许了21、22、80、443这几个端口,并做了一些并发限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Table: filter
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpts:20000:30000
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
8 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 10
9 ACCEPT all -f 0.0.0.0/0 0.0.0.0/0 limit: avg 100/sec burst 100
10 syn-flood tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02
11 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

添加需要开放的端口

例如 MySQL 的3306,Tomcat 的8080(如果已经用 nginx 把 80 端口反向代理到了 8080,就不需要开放 8080 端口了),加上一些自己希望开放的端口,例如我经常会开放几个端口例如 6666、7777、8888 等来做 webhook 自动部署。

1
$ vi /etc/sysconfig/iptables

添加并保存

1
2
3
4
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6666 -j ACCEPT
...

重启服务

1
$ service iptables restart

查看防火墙状态

再次查看防火墙状态,就可以看到过滤器新增了刚刚添加的过滤规则,接受了 3306、8080 等端口。

修改数据库

缘由

一般不直接使用root用户,需要新建一个数据库用户并授权所有权限,使用这个用户来远程登录。

修改

  • 登录数据库
1
2
$ mysql -u root -p
Enter password:
  • 新建用户
1
2
$ CREATE USER 'bingo'@'localhost' IDENTIFIED BY 'xxxxxx';
$ CREATE USER 'bingo'@'%' IDENTIFIED BY 'xxxxxx';
  • 授权
1
2
$ GRANT ALL ON *.* TO 'bingo'@'%';
$ GRANT ALL ON *.* TO 'bingo'@'localhost';
  • 刷新系统权限表,退出
1
2
$ flush privileges;
$ exit

Let’s Encrypt - HTTPS

缘由

使用 Let’s Encrypt 免费让网站支持 HTTPS,如果自己给移动端写接口,苹果已经强制要求 HTTPS 了,作为一个 iOS developer,部署 HTTPS 环境也是挺重要的。当然,如果你不想用免费的,可以直接去申请收费的 ssl 证书,这里就不多阐述了。

安装

OneinStack 已经内置 Let’s Encrypt,vhost.sh 绑定域名时自动申请、绑定、自动续期(默认90天)一步到位。

安装 oneinstack,前面已经完成。

安装 Let’s Encrypt

1
2
$ cd oneinstack
$ ./addons.sh

弹出选项菜单选择 7(Install/Uninstall Let’s Encrypt client),然后选择 1(install)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#######################################################################
# OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+ #
# Install/Uninstall Extensions #
# For more information please visit https://oneinstack.com #
#######################################################################
What Are You Doing?
1. Install/Uninstall PHP opcode cache
2. Install/Uninstall ZendGuardLoader/ionCube PHP Extension
3. Install/Uninstall ImageMagick/GraphicsMagick PHP Extension
4. Install/Uninstall fileinfo PHP Extension
5. Install/Uninstall memcached/memcache
6. Install/Uninstall Redis
7. Install/Uninstall Let's Encrypt client
8. Install/Uninstall fail2ban
q. Exit
Please input the correct option: 7
Please select an action:
1. install
2. uninstall
Please input a number:(Default 1 press Enter) 1

安装完成后会输出一行:

1
Let's Encrypt client installed successfully!

添加虚拟主机,绑定域名

1
$ ./vhost.sh

SSL 选择 y,Let’s Encrypt 选择 y

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#######################################################################
# OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+ #
# For more information please visit https://oneinstack.com #
#######################################################################
Do you want to setup SSL under Nginx? [y/n]: y
Please input domain(example: www.example.com): blog.bingo.ren
Please input the directory for the domain:blog.bingo.ren :
(Default directory: /data/wwwroot/blog.bingo.ren):
Virtual Host Directory=/data/wwwroot/blog.bingo.ren
Create Virtul Host directory......
set permissions of Virtual Host directory......
domain=blog.bingo.ren
Do you want to add more domain name? [y/n]: n
Do you want to redirect all HTTP requests to HTTPS? [y/n]: y
Do you want to use a Let's Encrypt certificate? [y/n]: y
Please enter Administrator Email(example: admin@example.com): bingo@dankal.cn
Do you want to add hotlink protection? [y/n]: n
Allow Nginx/Tengine/OpenResty access_log? [y/n]: y
You access log file=/data/wwwlogs/blog.bingo.ren_nginx.log

然后就会自动重启 Nginx 和 Tomcat 服务,最后会输出部署信息。

1
2
3
4
5
6
7
8
9
10
#######################################################################
# OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+ #
# For more information please visit https://oneinstack.com #
#######################################################################
Your domain: blog.bingo.ren
Nginx Virtualhost conf: /usr/local/nginx/conf/vhost/blog.bingo.ren.conf
Tomcat Virtualhost conf: /usr/local/tomcat/conf/vhost/blog.bingo.ren.xml
Directory of: /data/wwwroot/blog.bingo.ren
Let's Encrypt SSL Certificate:/etc/letsencrypt/live/blog.bingo.ren/fullchain.pem
SSL Private Key: /etc/letsencrypt/live/blog.bingo.ren/privkey.pem

补充

  • 绑定域名后会自动在 crontab 添加相应自动续期脚本。
  • 同一个 ip 在3小时内最多申请10个域名的证书。
  • 同一个根域名在七天内,只能注册5个证书。
  • 同一个子域名注册或更新都是要计算次数的。

后话

这只是简单的部署环境,还没有部署项目和自动化脚本,我会慢慢补充,持续更新。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/28.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!