> CentOS > CentOS服务器 > 环境配置 >

CentOS 7 配置 LNMP + FTP 环境

CentOS 7 与前代相比有了巨大改变,  服务管理器, 时间设置等等, 对于习惯了前代版本的人来说还是需要时间适应的.

下面讲一下如何从头配置 CentOS 生产环境, 以 DigitalOcean 云主机为例, 有关此云主机的介绍 请点这里

CentOS 7 为64位系统, 最低内存要求512M.

 一. 添加常用软件源

1. 添加 Remi

Remi 主打 php 及相关扩展, 所以安装 php 这个源是不二选择.
首先进入 Remi 网站, 在 Maintained Enterprise Linux (RHEL / CentOS / Other clones) 列表中找到 Enterprise Linux 7 项后面的 remi-release-7.rpm , 执行下面的命令安装.

 
 
 
1
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

编辑 remi.repo 文件

 
 
 
 
 
 
1
nano /etc/yum.repos.d/remi.repo

修改 [remi], [remi-php56] 的 enabled 项为启用

 
 
 
 
 
1
enabled=1

保存退出

一般来说, 安装 Remi 源的时候会附带安装 EPEL 源, 如果没有安装, 则按以下方法安装.

2. 添加 EPEL

EPEL 包含丰富的软件, 进入网站往下拉, 找到 How can I use these extra packages? 项, 根据系统架构与版本选 The newest version of ‘epel-release’ for EL7, 点击, 系统会根据来访ip查找最快的源镜像, 国内访问通常会转到搜狐与中科大的源.如果想用美国源, 最好是用代理访问或者在服务器中输入如下命令

 
 
 
 
 
1
wget -S http://download.fedoraproject.org/pub/epel/7/x86_64/repoview/epel-release.html

这会显示响应中的302跳转情况, 从中找到最终的镜像地址.
如果你是懒人, 那么给你个麻省理工的地址, 直接用吧.

 
 
 
 
1
yum install http://mirrors.mit.edu/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

 

 3. 添加 Nginx

进入 Nginx 官网 , 点右侧的 download 链接, 拉到最下面找到 Pre-Built Packages 项. 点 mainline version(主线版本; stable version 为稳定版本) 版本的链接. 根据提示编辑 repo 文件的内容, 具体操作如下.
在 yum repo 目录创建新的 nginx.repo 文件

 
 
 
 
1
nano /etc/yum.repos.d/nginx.repo

输入以下内容

 
 
 
 
 
1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

保存退出

4.添加 ulyaoth

这个网站貌似是个人站点, 用于分享资源和技术交流, 使用它的原因是因为这里有带 google Pagespeed 的 Nginx 包. 因 Nginx 集成 Pagespeed 需要从源码编译, 较为麻烦, 所以找了这个现成的.还需观察作者是否会持续更新. 关于 Pagespeed 请参考这里.

CentOS 7 使用下面的源

 
 
 
 
 
 
1
yum install https://downloads.ulyaoth.net/rpm/CentOS/x86_64/ulyaoth-1.0.10-1.el7.centos.x86_64.rpm

 

 
 
1
yum update

 

5. 添加 MariaDB

MariaDB 是 MySql 分支出来的项目, 因为 MySql 被 Oracle 收购且闭源, 所以有了 MariaDB, 并逐步添加新的功能. 最新版 10.x 已不再从 MySql 合并代码.

打开页面 https://downloads.mariadb.org/mariadb/repositories/#mirror=qiming&distro=CentOS ,选择最新版, 将下面的内容保存为 /etc/yum.repos.d/MariaDB.repo

 
 
 
 
 
1
2
3
4
5
6
7
# MariaDB 10.1 CentOS repository list - created 2016-04-30 03:48 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

更新 yum, 至此软件源添加完毕.

二. 配置生产环境

1. 安装 nginx

 

 
 
 
 
1
2
3
4
5
6
7
8
#安装nginx官方版本
yum install nginx
 
#或安装带 Pagespeed 的 nginx
yum install ulyaoth-nginx-mainline-pagespeed
 
systemctl enable nginx #随系统启动
systemctl start nginx #启动服务

 

 2. 安装 php

 

 
 
 
 
1
2
3
yum install php php-fpm php-mysql php-pdo php-gd php-intl php-bcmath php-cli php-mbstring php-mcrypt
systemctl start php-fpm #启动服务
systemctl enable php-fpm #随系统启动

安装 Zend Opcache 缓存扩展

 
 
 
 
 
1
yum install php-opcache

如果 httpd 服务启动了, 停用此服务.

 
 
 
 
1
2
systemctl disable httpd #禁止随系统启动
systemctl stop httpd #停用服务

 

为了避免 nginx 与 php-fpm 使用中出现权限不足的问题(例如 wordpress 自动更新时要求授权), 建议将 nginx 与 php-fpm 的执行帐户统一, 且不允许该帐户登录系统, 且只允许操作 html 目录.

查看当前所有用户和用户组

 
 
 
 
 
1
2
3
4
#查看用户
cat /etc/passwd
#查看用户组
cat /etc/group

添加一个web相关服务公用帐户并创建一个公用组, 以备后面使用.

 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
#新建名为 webservices 的用户组
groupadd webservices
 
#添加一个名为 webuser 的帐户, 不允许登录系统.
useradd -s /sbin/nologin webuser
 
#将用户同时添加到两个组中,因为 nginx 要求用户名和组名相同
usermod -G webuser,webservices webuser
 
#查看某用户所属的用户组
groups webuser

这里将 webuser 用户添加到两个用户组中, 可根据实际情况自行设置.

修改 nginx 配置, 使用 webuser 帐户执行.

 
 
 
 
1
nano /etc/nginx/nginx.conf

找到 user nginx; 将其改为

 
 
 
 
 
1
user webuser;

将 nginx 的 html 目录所有者改为 webuser, 用户组改为 webservices

 
 
 
 
 
 
1
chown -R webuser:webservices /usr/share/nginx/html

修改 php-fpm 配置, 使用 webuser 帐户执行.

 
 
 
 
 
1
nano /etc/php-fpm.d/www.conf

找到 user = apache 和 group = apache 将其改为

 
 
 
 
 
1
2
user = webuser
group = webservices

配置 Nginx

 
 
 
 
 
1
nano /etc/nginx/nginx.conf

修改为

 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#上一步中修改的用户名
user  webuser;
#nginx 使用的线程数, cpu核数 * 2 最佳.
worker_processes 2;
#并发请求时使用线程的顺序, 用二进制位表示.
worker_cpu_affinity 01 10;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    #最大连接数
    worker_connections  1024;
    #允许 Nginx 在已经得到一个新连接的通知时接收尽可能更多的连接
    multi_accept on;
}
 
#下面省略

启用 https

请参考 <<CentOS 7 Nginx Let’ s Encrypt SSL 证书安装配置>>

启用 gzip 压缩

 
 
 
 
 
1
nano /etc/nginx/conf.d/default.conf

在文件首行前加入下面的内容

 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
    gzip on;
    gzip_http_version   1.1;
    gzip_min_length     1k;
    gzip_buffers        4 8k;
    gzip_comp_level     2;
    gzip_types          text/plain text/css
                        application/x-javascript text/xml
                        application/xml application/xml+rss
                        text/javascript;
    gzip_vary           on;

各选项说明

  • gzip on;
    该指令用于开启或关闭gzip模块(on/off)
  • gzip_http_version 1.1;
    识别http的协议版本(1.0/1.1)
  • gzip_min_length 1k;
    设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
  • gzip_buffers 4 8k;
    设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,以8k为单位的4倍申请内存。
  • gzip_comp_level 2;
    gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
  • gzip_types text/plain text/css
    application/x-javascript text/xml
    application/xml application/xml+rss
    指定要压缩的 mime 类型. 无论是否指定, ”text/html” 类型总是会被压缩的.
  • gzip_vary on;
    由于客户端和服务端之间可能存在一个或多个中间实体(如缓存服务器),有些实现得有 BUG 的缓存服务器,会忽略响应头中的 Content-Encoding,从而可能给不支持压缩的客户端返回缓存的压缩版本.
    有两个方案可以避免这种情况发生:

     

    1. 将响应头中的 Cache-Control 字段设为 private,告诉中间实体不要缓存它.
    2. 增加 Vary: Accept-Encoding 响应头,明确告知缓存服务器按照 Accept-Encoding 字段的内容,分别缓存不同的版本.

    nginx 使用第二种方案.

设置默认虚拟主机, 找到 server 节中的 listen 参数, 在端口后面加入 default 表示此虚拟主机为默认值, 当找不到配置 server_name 虚拟主机时会使用这里的默认虚拟主机.

 
 
 
 
 
 
1
2
3
4
5
6
server {
    listen       80 default;
    server_name  localhost;
 
    #以下省略
}

添加默认首页, 找到以下内容

 
 
1
2
3
4
location / {
      root   html;
      index  index.html index.htm;
}

将 root 提到 location 外层, 成为全局设置.
在 index 项中加入 index.php 类型

 
1
2
3
4
5
root /usr/share/nginx/html;
 
location / {
      index  index.html index.htm index.php;
}

使用 php-fpm
去掉以下内容的注释

 
1
2
3
4
5
6
7
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

删除或注释掉 root 项, 修改 fastcgi_param 项, 将 /scripts$fastcgi_script_name; 替换为 $request_filename;

 
 
 
1
2
3
4
5
6
7
8
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    #或者像下面这样也是可以的
    #fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

禁止访问 .htxxx 文件

 
 
 
 
1
2
3
location ~ /.ht {
    deny all;
}

设置静态文件缓存时间
在 location 下方加入下面的配置.

 
 
 
1
2
3
4
5
6
7
8
9
10
11
#设置静态文件过期时间为10天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 10d;
}
 
#设置js, css文件过期时间为1天
location ~ .*\.(js|css)?$
{
    expires 1d;
}

最后的样子如下

 
 
 
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
58
59
60
61
62
63
64
    gzip on;
    gzip_http_version   1.1;
    gzip_min_length     1k;
    gzip_buffers        4 8k;
    gzip_vary           on;
    gzip_comp_level     2;
    gzip_types          text/plain text/css
                        application/x-javascript text/xml
                        application/xml application/xml+rss
                        text/javascript;
 
server {
    listen       80 default;
    server_name  localhost;
 
    root /usr/share/nginx/html;
 
    charset utf-8;
    #access_log  /var/log/nginx/log/host.access.log  main;
 
    location / {
        index  index.php index.html index.htm;
    }
 
    #error_page  404              /404.html;
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;
        include        fastcgi_params;
    }
 
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one    
    location ~ /\.ht {
        deny  all;
    }
 
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d;
    }
 
    location ~ .*\.(js|css)?$
    {
        expires 1d;
    }
}

保存退出

配置 php

 
 
1
nano /etc/php.ini

将允许上传的最大值改为20M(根据需求定).

 
 
 
 
1
2
post_max_size = 20M
upload_max_filesize = 20M

配置 php-fpm

 
 
1
nano /etc/php-fpm.d/www.conf

修改用户名和用户组, 优化参数.

 
 
1
2
3
4
5
6
7
8
user = webuser
group = webservices
 
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 120

保存退出

重启 Nginx 与 php-fpm 服务

 
 
 
1
2
systemctl restart nginx
systemctl restart php-fpm

在 /usr/share/nginx/html 中新建 phpinfo.php 文件

 
 
 
1
nano /usr/share/nginx/html/phpinfo.php

 

 
 
1
2
3
<?php
  phpinfo();
?>

保存退出

暂时关闭防火墙, 待所有服务配置完成后统一设置防火墙.

 
 
 
1
2
systemctl stop iptables
systemctl stop firewalld #如果使用 firewallD 防火墙, 则是这样关闭

如能在浏览器中使用 ip 访问, 说明安装成功.

3. 安装 MariaDB 数据库

 

 
 
1
yum install mariadb-server mariadb-client

如果出示包冲突, 可能是因为已经安装了 mysql 相关的包, 应先卸载.

 
 
 
1
yum remove mysql*

然后再次安装即可.

 
1
2
systemctl enable mariadb #随系统启动
systemctl start mariadb #启动服务

查询当前所有用户

 
 
 
 
1
2
3
mysql
use mysql;
select host,user,password from user;

增加新用户:

 
 
 
1
grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”

如,增加一个用户user1密码为password1,让其可以在任何主机上登录, 并对所有数  据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令,注意不要忘了分号.

 
 
 
 
1
2
3
mysql
grant <select,insert,update,delete|all> on *.* to user1@'%' identified by "password1";
flush privileges;

如果你不想user1有密码,可以再打一个命令将密码去掉。

 
 
 
 
 
1
2
3
4
mysql
grant <select,insert,update,delete|all> on *.* to user1@'%' identified by "";
flush privileges;
quit

根据服务器配置优化 MariaDB

根据内存大小选择示例配置文件(位于 /usr/share/mysql/ 中, 以 my-xxxx.cnf 命名), 复制到 /etc/my.cnf.d/ 中, 然后高速参数配置. 我的服务器内存为 512M, 因此选择 my-large.cnf.

 
 
 
 
 
1
2
cp /usr/share/mysql/my-large.cnf /etc/my.cnf.d/myserver.cnf
nano /etc/my.cnf.d/myserver.cnf

去掉 innodb 前的”#”号以启用 InnoDB 引擎, 优化各项参数

 
 
 
 
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
[mysqld]
#将默认引擎改为 innodb
default-storage-engine = innodb
<span class="keyword">default</span>-<span class="keyword">character</span>-<span class="keyword">set</span>=utf8
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 96M
max_allowed_packet = 4M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2
 
innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 96M
innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
#日志先写到磁盘缓存, 再写到磁盘, 而不是强制写入磁盘
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50

保存退出, 重启 MariaDB.

 
 
 
 
 
1
systemctl restart mariadb

如果遇到无法启动的情况, 可能是因为 InnoDB 中设置的日志文件大小与实际存在的大小不一至. 因为这里是新安装的数据库, 所以直接删除已经存在的日志文件, 重启后会生成新的. 如果是有重要数据的数据库, 则应修改配置值为原文件相应大小.

 
 
1
2
3
4
5
#删除已经存在的数据库文件
rm /var/lib/mysql/ib_logfile*
 
#重新启动
systemctl restart mariadb

 

4. 安装 vsFTP

 

 
 
1
yum install vsftpd

创建vsftp 使用的本地帐号, 禁止在本地登录.

 
 
 
 
1
2
3
4
5
6
7
8
9
#创建一个无法登录shell的用户
useradd -s /sbin/nologin vsftp
 
#将用户添加到 webservices 组
usermod -G vsftp,webservices vsftp
groups vsftp
 
#将ftp根目录的读写权限赋给 html 文件夹属主(这是里 webuser)同用户组(这里是 webuser 和 webservices )的其他用户.
chmod -R g+rw /usr/share/nginx/html

编辑配置文件

 
 
 
1
nano /etc/vsftpd/vsftpd.conf

我们这里使用虚拟用户的形式, 配置如下.

 
 
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
anonymous_enable=no #禁用匿名ftp
local_enable=yes #使用虚拟用户必须开启
write_enable=yes #允许任何ftp写入
local_umask=022 #上传的文件的权限
dirmessage_enable=YES #启用目录信息
xferlog_enable=yes #启用日志
connect_from_port_20=yes #使用20端口发起连接
ftpd_banner=Welcome to My FTP Server ^_^. #ftp连接欢迎语
chroot_local_user=YES #禁止用户浏览自己目录以外的目录
ls_recurse_enable=yes #启用循环目录结构, 系统性能够强才启用.
listen=no #64位系统中禁用仅ipv4监听
listen_ipv6=YES #启用ipv6监听, 将同时监听ipv4和ipv6
 
pam_service_name=vsftpd #验证模块
userlist_enable=yes #禁止 user_list 文件中列出的用户登录
tcp_wrappers=yes #使用 tcp 防火墙
 
#以下是手动添加的
pasv_min_port=30000 #被动模式中使用的最小端口
pasv_max_port=35000 #被动模式中使用的最大端口
 
guest_enable=YES #启用虚拟用户
guest_username=vsftp #虚拟用户绑定的本地用户
virtual_use_local_privs=YES #虚拟用户和本地用户有相同权限
allow_writeable_chroot=YES #允许ftp根目录可写
user_config_dir=/etc/vsftpd/user_conf #虚拟用户配置目录

生成vsftpd虚拟用户数据库文件
建立虚拟用户名单文件

 
 
 
 
1
nano /etc/vsftpd/ftpuser

输入以下内容

 
 
 
1
2
3
4
ftp1
password1
ftp2
password2

格式很简单:“一行用户名,一行密码!”。
生成虚拟用户数据文件

 
 
1
2
db_load -T -t hash -f /etc/vsftpd/ftpuser /etc/vsftpd/users.db
chmod 600 /etc/vsftpd/users.db

配置PAM验证文件

 
 
 
1
nano /etc/pam.d/vsftpd

将原有内容注释或删除, 将以下内容加入到文件中.

 
 
 
 
 
1
2
3
#db=/etc/vsftpd/users , 这里的users 是上一步创建的数据库名, 去掉后缀.
auth required pam_userdb.so db=/etc/vsftpd/users
account required pam_userdb.so db=/etc/vsftpd/users

创建虚拟用户独立配置文件

每个虚拟用户必需有一个同用户名相同的配置文件, 这个文件里保存着对这个用户的个性化配置, 里面的属性可以是 vsftpd.conf 中的任何属性.

创建虚拟用户配置文件目录, 这个目录是在 vsftpd.conf 中 user_config_dir= 配置的.

 
 
 
1
mkdir /etc/vsftpd/user_conf

创建用户配置文件,以用户名命名.

 
 
 
1
nano /etc/vsftpd/user_conf/ftp1

写入以下内容

 
 
 
 
1
2
3
4
5
6
local_root=/usr/share/nginx/html #当前用户的ftp根目录
idle_session_timeout=600
data_connection_timeout=120
max_clients=10 #最大连接数
max_per_ip=5 #最大线程数
local_max_rate=50000 #最大带宽, 这里限制为50K

启动服务

 
 
 
1
2
systemctl enable vsftpd
systemctl start vsftpd

 

 

5. 允许通过防火墙

CentOS 7 改用 FirewallD 防火墙. 但目前资料相对较少, 有些复杂的问题不知如何配置, 所以还是改回 iptables.
首先禁用 firewalld , 启用 iptables.

 
 
1
2
3
4
5
6
7
yum install iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
systemctl enable ip6tables
systemctl start ip6tables

 

iptables 配置方法

刚安装完 iptables, 执行 iptables -L 命令, 查看默认配置, 看起来像下面的样子.

 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Chain INPUT (policy ACCEPT) #输入表
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED  #放行所有连入的正在建立连接或已建立连接的包
ACCEPT     icmp --  anywhere             anywhere    #放行连入的icmp包
ACCEPT     all  --  anywhere             anywhere    #放行所有连入的包
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh  #放行 ssh 包
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  #拒绝所有连入的包
 
Chain FORWARD (policy ACCEPT) #转发表
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  #拒绝所有转发包
 
Chain OUTPUT (policy ACCEPT)  #输出表
target     prot opt source               destination

iptables 的匹配规则是按从上至下的顺序判断的, 遇到 REJECT 如果匹配则停止查找规则. 所以要注意 REJECT 项在规则中的顺序, 避免影响其他规则.

我们把规则清除, 重新配置.

 
 
 
1
2
3
4
5
6
7
8
9
iptables -F #清除所有表的规则
 
#设置 INPUT、FORWARD、及 OUTPUT 表的缺省政策
iptables -P INPUT DROP       #默认丢弃
iptables -P FORWARD DROP     #默认丢弃
iptables -P OUTPUT ACCEPT    #默认放行
 
iptables -A INPUT -i lo -j ACCEPT #允许本地网络访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  #放行所有正在建立连接或已建立连接的包

开放 ssh 服务

 
 
 
 
1
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #放行 ssh 端口

开放 http 服务

 
 
 
 
1
2
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

开放 ftp 服务

 
 
 
 
1
2
3
iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT #被动模式中使用的端口范围

开放 mysql

 
 
 
 
1
iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

保存配置

 
 
 
1
2
service iptables save #保存
systemctl restart iptables #重启服务

至此, 防火墙配置完成. 其实熟悉 iptables 命令后有一种更简单的配置方式–直接编辑 iptables 配置存储文件.

 
 
 
1
nano /etc/sysconfig/iptables

用以下内容覆盖原有内容, 注意规则顺序.

 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

保存退出, 重启服务.

 
 
 
1
systemctl restart iptables

 

 

如果是使用 firewalld 的, 配置方法如下, 使用 iptables 则可忽略.

查看 firewalld 中是否已经定义了 vsftpd 服务

 
1
firewall-cmd --permanent --get-services #列出永久选项所支持的服务

没有找到 vsftpd 服务, 那么我们手动新增一个 vsftpd 服务.

 
 
 
 
 
1
2
3
4
cd /usr/lib/firewalld/services #进入firewalld服务定义目录
cat tftp.xml #随便浏览一个服务的定义, 这里选的是 tftp.
cp tftp.xml vsftp.xml #复制xml文件, 命名为vsftp.xml.
nano vsftp.xml #编辑文件

编辑文件, 修改名称,描述,协议和端口的定义, 删除不必要的内容. 得到如下所示.

 
 
 
 
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>vsFtp</short>
  <description>The Trivial File Transfer Protocol (vsFtp) is a protocol used to transfer files to and from a remote mac$
  <port protocol="tcp" port="20"/>
  <port protocol="tcp" port="21"/>
</service>

保存退出
添加服务到当前区域

 
 
 
1
2
3
4
firewall-cmd --permanent --add-service=vsftp #永久开放vsftp
firewall-cmd --permanent --add-port=30000-50000/tcp #永久开放此端口范围
firewall-cmd --reload #重新加载配置,必要步骤.
firewall-cmd --list-all #列出当前开放的服务与端口

至此, ftp 服务配置完成.

CentOS 7 与前代相比有了巨大改变,  服务管理器, 时间设置等等, 对于习惯了前代版本的人来说还是需要时间适应的.

下面讲一下如何从头配置 CentOS 生产环境, 以 DigitalOcean 云主机为例, 有关此云主机的介绍 请点这里

CentOS 7 为64位系统, 最低内存要求512M.

 一. 添加常用软件源

1. 添加 Remi

Remi 主打 php 及相关扩展, 所以安装 php 这个源是不二选择.
首先进入 Remi 网站, 在 Maintained Enterprise Linux (RHEL / CentOS / Other clones) 列表中找到 Enterprise Linux 7 项后面的 remi-release-7.rpm , 执行下面的命令安装.

 
 
 
1
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

编辑 remi.repo 文件

 
 
 
 
1
nano /etc/yum.repos.d/remi.repo

修改 [remi], [remi-php56] 的 enabled 项为启用

 
 
 
 
1
enabled=1

保存退出

一般来说, 安装 Remi 源的时候会附带安装 EPEL 源, 如果没有安装, 则按以下方法安装.

2. 添加 EPEL

EPEL 包含丰富的软件, 进入网站往下拉, 找到 How can I use these extra packages? 项, 根据系统架构与版本选 The newest version of ‘epel-release’ for EL7, 点击, 系统会根据来访ip查找最快的源镜像, 国内访问通常会转到搜狐与中科大的源.如果想用美国源, 最好是用代理访问或者在服务器中输入如下命令

 
 
1
wget -S http://download.fedoraproject.org/pub/epel/7/x86_64/repoview/epel-release.html

这会显示响应中的302跳转情况, 从中找到最终的镜像地址.
如果你是懒人, 那么给你个麻省理工的地址, 直接用吧.

 
 
1
yum install http://mirrors.mit.edu/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

 

 3. 添加 Nginx

进入 Nginx 官网 , 点右侧的 download 链接, 拉到最下面找到 Pre-Built Packages 项. 点 mainline version(主线版本; stable version 为稳定版本) 版本的链接. 根据提示编辑 repo 文件的内容, 具体操作如下.
在 yum repo 目录创建新的 nginx.repo 文件

 
 
 
1
nano /etc/yum.repos.d/nginx.repo

输入以下内容

 
1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

保存退出

4.添加 ulyaoth

这个网站貌似是个人站点, 用于分享资源和技术交流, 使用它的原因是因为这里有带 google Pagespeed 的 Nginx 包. 因 Nginx 集成 Pagespeed 需要从源码编译, 较为麻烦, 所以找了这个现成的.还需观察作者是否会持续更新. 关于 Pagespeed 请参考这里.

CentOS 7 使用下面的源

 
 
1
yum install https://downloads.ulyaoth.net/rpm/CentOS/x86_64/ulyaoth-1.0.10-1.el7.centos.x86_64.rpm

 

 
1
yum update

 

5. 添加 MariaDB

MariaDB 是 MySql 分支出来的项目, 因为 MySql 被 Oracle 收购且闭源, 所以有了 MariaDB, 并逐步添加新的功能. 最新版 10.x 已不再从 MySql 合并代码.

打开页面 https://downloads.mariadb.org/mariadb/repositories/#mirror=qiming&distro=CentOS ,选择最新版, 将下面的内容保存为 /etc/yum.repos.d/MariaDB.repo

 
 
 
1
2
3
4
5
6
7
# MariaDB 10.1 CentOS repository list - created 2016-04-30 03:48 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

更新 yum, 至此软件源添加完毕.

二. 配置生产环境

1. 安装 nginx

 

 
 
1
2
3
4
5
6
7
8
#安装nginx官方版本
yum install nginx
 
#或安装带 Pagespeed 的 nginx
yum install ulyaoth-nginx-mainline-pagespeed
 
systemctl enable nginx #随系统启动
systemctl start nginx #启动服务

 

 2. 安装 php

 

 
 
1
2
3
yum install php php-fpm php-mysql php-pdo php-gd php-intl php-bcmath php-cli php-mbstring php-mcrypt
systemctl start php-fpm #启动服务
systemctl enable php-fpm #随系统启动

安装 Zend Opcache 缓存扩展

 
 
 
1
yum install php-opcache

如果 httpd 服务启动了, 停用此服务.

 
 
1
2
systemctl disable httpd #禁止随系统启动
systemctl stop httpd #停用服务

 

为了避免 nginx 与 php-fpm 使用中出现权限不足的问题(例如 wordpress 自动更新时要求授权), 建议将 nginx 与 php-fpm 的执行帐户统一, 且不允许该帐户登录系统, 且只允许操作 html 目录.

查看当前所有用户和用户组

 
 
1
2
3
4
#查看用户
cat /etc/passwd
#查看用户组
cat /etc/group

添加一个web相关服务公用帐户并创建一个公用组, 以备后面使用.

 
 
 
1
2
3
4
5
6
7
8
9
10
11
#新建名为 webservices 的用户组
groupadd webservices
 
#添加一个名为 webuser 的帐户, 不允许登录系统.
useradd -s /sbin/nologin webuser
 
#将用户同时添加到两个组中,因为 nginx 要求用户名和组名相同
usermod -G webuser,webservices webuser
 
#查看某用户所属的用户组
groups webuser

这里将 webuser 用户添加到两个用户组中, 可根据实际情况自行设置.

修改 nginx 配置, 使用 webuser 帐户执行.

 
 
1
nano /etc/nginx/nginx.conf

找到 user nginx; 将其改为

 
 
 
 
1
user webuser;

将 nginx 的 html 目录所有者改为 webuser, 用户组改为 webservices

 
 
 
1
chown -R webuser:webservices /usr/share/nginx/html

修改 php-fpm 配置, 使用 webuser 帐户执行.

 
1
nano /etc/php-fpm.d/www.conf

找到 user = apache 和 group = apache 将其改为

 
 
1
2
user = webuser
group = webservices

配置 Nginx

 
 
 
 
1
nano /etc/nginx/nginx.conf

修改为

 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#上一步中修改的用户名
user  webuser;
#nginx 使用的线程数, cpu核数 * 2 最佳.
worker_processes 2;
#并发请求时使用线程的顺序, 用二进制位表示.
worker_cpu_affinity 01 10;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    #最大连接数
    worker_connections  1024;
    #允许 Nginx 在已经得到一个新连接的通知时接收尽可能更多的连接
    multi_accept on;
}
 
#下面省略

启用 https

请参考 <<CentOS 7 Nginx Let’ s Encrypt SSL 证书安装配置>>

启用 gzip 压缩

 
 
 
 
1
nano /etc/nginx/conf.d/default.conf

在文件首行前加入下面的内容

 
 
 
1
2
3
4
5
6
7
8
9
10
    gzip on;
    gzip_http_version   1.1;
    gzip_min_length     1k;
    gzip_buffers        4 8k;
    gzip_comp_level     2;
    gzip_types          text/plain text/css
                        application/x-javascript text/xml
                        application/xml application/xml+rss
                        text/javascript;
    gzip_vary           on;

各选项说明

  • gzip on;
    该指令用于开启或关闭gzip模块(on/off)
  • gzip_http_version 1.1;
    识别http的协议版本(1.0/1.1)
  • gzip_min_length 1k;
    设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
  • gzip_buffers 4 8k;
    设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,以8k为单位的4倍申请内存。
  • gzip_comp_level 2;
    gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
  • gzip_types text/plain text/css
    application/x-javascript text/xml
    application/xml application/xml+rss
    指定要压缩的 mime 类型. 无论是否指定, ”text/html” 类型总是会被压缩的.
  • gzip_vary on;
    由于客户端和服务端之间可能存在一个或多个中间实体(如缓存服务器),有些实现得有 BUG 的缓存服务器,会忽略响应头中的 Content-Encoding,从而可能给不支持压缩的客户端返回缓存的压缩版本.
    有两个方案可以避免这种情况发生:

     

    1. 将响应头中的 Cache-Control 字段设为 private,告诉中间实体不要缓存它.
    2. 增加 Vary: Accept-Encoding 响应头,明确告知缓存服务器按照 Accept-Encoding 字段的内容,分别缓存不同的版本.

    nginx 使用第二种方案.

设置默认虚拟主机, 找到 server 节中的 listen 参数, 在端口后面加入 default 表示此虚拟主机为默认值, 当找不到配置 server_name 虚拟主机时会使用这里的默认虚拟主机.

 
 
1
2
3
4
5
6
server {
    listen       80 default;
    server_name  localhost;
 
    #以下省略
}

添加默认首页, 找到以下内容

 
 
 
1
2
3
4
location / {
      root   html;
      index  index.html index.htm;
}

将 root 提到 location 外层, 成为全局设置.
在 index 项中加入 index.php 类型

 
 
 
1
2
3
4
5
root /usr/share/nginx/html;
 
location / {
      index  index.html index.htm index.php;
}

使用 php-fpm
去掉以下内容的注释

 
 
1
2
3
4
5
6
7
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

删除或注释掉 root 项, 修改 fastcgi_param 项, 将 /scripts$fastcgi_script_name; 替换为 $request_filename;

 
 
 
 
1
2
3
4
5
6
7
8
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    #或者像下面这样也是可以的
    #fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

禁止访问 .htxxx 文件

 
 
 
 
1
2
3
location ~ /.ht {
    deny all;
}

设置静态文件缓存时间
在 location 下方加入下面的配置.

 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
#设置静态文件过期时间为10天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 10d;
}
 
#设置js, css文件过期时间为1天
location ~ .*\.(js|css)?$
{
    expires 1d;
}

最后的样子如下

 
 
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
58
59
60
61
62
63
64
    gzip on;
    gzip_http_version   1.1;
    gzip_min_length     1k;
    gzip_buffers        4 8k;
    gzip_vary           on;
    gzip_comp_level     2;
    gzip_types          text/plain text/css
                        application/x-javascript text/xml
                        application/xml application/xml+rss
                        text/javascript;
 
server {
    listen       80 default;
    server_name  localhost;
 
    root /usr/share/nginx/html;
 
    charset utf-8;
    #access_log  /var/log/nginx/log/host.access.log  main;
 
    location / {
        index  index.php index.html index.htm;
    }
 
    #error_page  404              /404.html;
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;
        include        fastcgi_params;
    }
 
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one    
    location ~ /\.ht {
        deny  all;
    }
 
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d;
    }
 
    location ~ .*\.(js|css)?$
    {
        expires 1d;
    }
}

保存退出

配置 php

 
 
 
 
1
nano /etc/php.ini

将允许上传的最大值改为20M(根据需求定).

 
 
 
 
1
2
post_max_size = 20M
upload_max_filesize = 20M

配置 php-fpm

 
 
 
 
1
nano /etc/php-fpm.d/www.conf

修改用户名和用户组, 优化参数.

 
 
 
 
 
1
2
3
4
5
6
7
8
user = webuser
group = webservices
 
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 120

保存退出

重启 Nginx 与 php-fpm 服务

 
 
 
 
1
2
systemctl restart nginx
systemctl restart php-fpm

在 /usr/share/nginx/html 中新建 phpinfo.php 文件

 
 
 
 
1
nano /usr/share/nginx/html/phpinfo.php

 

1
2
3
<?php
  phpinfo();
?>

保存退出

暂时关闭防火墙, 待所有服务配置完成后统一设置防火墙.

 
 
 
1
2
systemctl stop iptables
systemctl stop firewalld #如果使用 firewallD 防火墙, 则是这样关闭

如能在浏览器中使用 ip 访问, 说明安装成功.

3. 安装 MariaDB 数据库

 

 
1
yum install mariadb-server mariadb-client

如果出示包冲突, 可能是因为已经安装了 mysql 相关的包, 应先卸载.

 
 
 
 
1
yum remove mysql*

然后再次安装即可.

 
 
1
2
systemctl enable mariadb #随系统启动
systemctl start mariadb #启动服务

查询当前所有用户

 
 
 
 
1
2
3
mysql
use mysql;
select host,user,password from user;

增加新用户:

 
 
 
 
1
grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”

如,增加一个用户user1密码为password1,让其可以在任何主机上登录, 并对所有数  据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令,注意不要忘了分号.

 
 
 
1
2
3
mysql
grant <select,insert,update,delete|all> on *.* to user1@'%' identified by "password1";
flush privileges;

如果你不想user1有密码,可以再打一个命令将密码去掉。

 
 
 
 
1
2
3
4
mysql
grant <select,insert,update,delete|all> on *.* to user1@'%' identified by "";
flush privileges;
quit

根据服务器配置优化 MariaDB

根据内存大小选择示例配置文件(位于 /usr/share/mysql/ 中, 以 my-xxxx.cnf 命名), 复制到 /etc/my.cnf.d/ 中, 然后高速参数配置. 我的服务器内存为 512M, 因此选择 my-large.cnf.

 
 
 
 
1
2
cp /usr/share/mysql/my-large.cnf /etc/my.cnf.d/myserver.cnf
nano /etc/my.cnf.d/myserver.cnf

去掉 innodb 前的”#”号以启用 InnoDB 引擎, 优化各项参数

 
 
 
 
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
[mysqld]
#将默认引擎改为 innodb
default-storage-engine = innodb
<span class="keyword">default</span>-<span class="keyword">character</span>-<span class="keyword">set</span>=utf8
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 96M
max_allowed_packet = 4M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2
 
innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 96M
innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
#日志先写到磁盘缓存, 再写到磁盘, 而不是强制写入磁盘
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50

保存退出, 重启 MariaDB.

 
 
 
 
1
systemctl restart mariadb

如果遇到无法启动的情况, 可能是因为 InnoDB 中设置的日志文件大小与实际存在的大小不一至. 因为这里是新安装的数据库, 所以直接删除已经存在的日志文件, 重启后会生成新的. 如果是有重要数据的数据库, 则应修改配置值为原文件相应大小.

 
 
1
2
3
4
5
#删除已经存在的数据库文件
rm /var/lib/mysql/ib_logfile*
 
#重新启动
systemctl restart mariadb

 

4. 安装 vsFTP

 

 
 
1
yum install vsftpd

创建vsftp 使用的本地帐号, 禁止在本地登录.

 
 
 
 
1
2
3
4
5
6
7
8
9
#创建一个无法登录shell的用户
useradd -s /sbin/nologin vsftp
 
#将用户添加到 webservices 组
usermod -G vsftp,webservices vsftp
groups vsftp
 
#将ftp根目录的读写权限赋给 html 文件夹属主(这是里 webuser)同用户组(这里是 webuser 和 webservices )的其他用户.
chmod -R g+rw /usr/share/nginx/html

编辑配置文件

 
 
1
nano /etc/vsftpd/vsftpd.conf

我们这里使用虚拟用户的形式, 配置如下.

 
 
 
 
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
anonymous_enable=no #禁用匿名ftp
local_enable=yes #使用虚拟用户必须开启
write_enable=yes #允许任何ftp写入
local_umask=022 #上传的文件的权限
dirmessage_enable=YES #启用目录信息
xferlog_enable=yes #启用日志
connect_from_port_20=yes #使用20端口发起连接
ftpd_banner=Welcome to My FTP Server ^_^. #ftp连接欢迎语
chroot_local_user=YES #禁止用户浏览自己目录以外的目录
ls_recurse_enable=yes #启用循环目录结构, 系统性能够强才启用.
listen=no #64位系统中禁用仅ipv4监听
listen_ipv6=YES #启用ipv6监听, 将同时监听ipv4和ipv6
 
pam_service_name=vsftpd #验证模块
userlist_enable=yes #禁止 user_list 文件中列出的用户登录
tcp_wrappers=yes #使用 tcp 防火墙
 
#以下是手动添加的
pasv_min_port=30000 #被动模式中使用的最小端口
pasv_max_port=35000 #被动模式中使用的最大端口
 
guest_enable=YES #启用虚拟用户
guest_username=vsftp #虚拟用户绑定的本地用户
virtual_use_local_privs=YES #虚拟用户和本地用户有相同权限
allow_writeable_chroot=YES #允许ftp根目录可写
user_config_dir=/etc/vsftpd/user_conf #虚拟用户配置目录

生成vsftpd虚拟用户数据库文件
建立虚拟用户名单文件

 
 
 
 
1
nano /etc/vsftpd/ftpuser

输入以下内容

 
 
 
 
1
2
3
4
ftp1
password1
ftp2
password2

格式很简单:“一行用户名,一行密码!”。
生成虚拟用户数据文件

 
 
 
 
 
1
2
db_load -T -t hash -f /etc/vsftpd/ftpuser /etc/vsftpd/users.db
chmod 600 /etc/vsftpd/users.db

配置PAM验证文件

 
 
 
 
1
nano /etc/pam.d/vsftpd

将原有内容注释或删除, 将以下内容加入到文件中.

 
 
 
 
 
1
2
3
#db=/etc/vsftpd/users , 这里的users 是上一步创建的数据库名, 去掉后缀.
auth required pam_userdb.so db=/etc/vsftpd/users
account required pam_userdb.so db=/etc/vsftpd/users

创建虚拟用户独立配置文件

每个虚拟用户必需有一个同用户名相同的配置文件, 这个文件里保存着对这个用户的个性化配置, 里面的属性可以是 vsftpd.conf 中的任何属性.

创建虚拟用户配置文件目录, 这个目录是在 vsftpd.conf 中 user_config_dir= 配置的.

 
 
 
 
1
mkdir /etc/vsftpd/user_conf

创建用户配置文件,以用户名命名.

 
 
 
 
1
nano /etc/vsftpd/user_conf/ftp1

写入以下内容

 
 
 
 
1
2
3
4
5
6
local_root=/usr/share/nginx/html #当前用户的ftp根目录
idle_session_timeout=600
data_connection_timeout=120
max_clients=10 #最大连接数
max_per_ip=5 #最大线程数
local_max_rate=50000 #最大带宽, 这里限制为50K

启动服务

 
 
 
 
1
2
systemctl enable vsftpd
systemctl start vsftpd

 

 

5. 允许通过防火墙

CentOS 7 改用 FirewallD 防火墙. 但目前资料相对较少, 有些复杂的问题不知如何配置, 所以还是改回 iptables.
首先禁用 firewalld , 启用 iptables.

 
 
 
 
 
1
2
3
4
5
6
7
yum install iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
systemctl enable ip6tables
systemctl start ip6tables

 

iptables 配置方法

刚安装完 iptables, 执行 iptables -L 命令, 查看默认配置, 看起来像下面的样子.

 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Chain INPUT (policy ACCEPT) #输入表
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED  #放行所有连入的正在建立连接或已建立连接的包
ACCEPT     icmp --  anywhere             anywhere    #放行连入的icmp包
ACCEPT     all  --  anywhere             anywhere    #放行所有连入的包
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh  #放行 ssh 包
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  #拒绝所有连入的包
 
Chain FORWARD (policy ACCEPT) #转发表
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited  #拒绝所有转发包
 
Chain OUTPUT (policy ACCEPT)  #输出表
target     prot opt source               destination

iptables 的匹配规则是按从上至下的顺序判断的, 遇到 REJECT 如果匹配则停止查找规则. 所以要注意 REJECT 项在规则中的顺序, 避免影响其他规则.

我们把规则清除, 重新配置.

 
 
 
 
1
2
3
4
5
6
7
8
9
iptables -F #清除所有表的规则
 
#设置 INPUT、FORWARD、及 OUTPUT 表的缺省政策
iptables -P INPUT DROP       #默认丢弃
iptables -P FORWARD DROP     #默认丢弃
iptables -P OUTPUT ACCEPT    #默认放行
 
iptables -A INPUT -i lo -j ACCEPT #允许本地网络访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  #放行所有正在建立连接或已建立连接的包

开放 ssh 服务

 
 
 
1
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #放行 ssh 端口

开放 http 服务

 
 
 
 
 
1
2
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

开放 ftp 服务

 
 
 
 
 
1
2
3
iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT #被动模式中使用的端口范围

开放 mysql

 
 
 
1
iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

保存配置

 
 
 
1
2
service iptables save #保存
systemctl restart iptables #重启服务

至此, 防火墙配置完成. 其实熟悉 iptables 命令后有一种更简单的配置方式–直接编辑 iptables 配置存储文件.

 
 
 
 
 
1
nano /etc/sysconfig/iptables

用以下内容覆盖原有内容, 注意规则顺序.

 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

保存退出, 重启服务.

 
 
 
1
systemctl restart iptables

 

 

如果是使用 firewalld 的, 配置方法如下, 使用 iptables 则可忽略.

查看 firewalld 中是否已经定义了 vsftpd 服务

 
 
 
 
1
firewall-cmd --permanent --get-services #列出永久选项所支持的服务

没有找到 vsftpd 服务, 那么我们手动新增一个 vsftpd 服务.

 
 
1
2
3
4
cd /usr/lib/firewalld/services #进入firewalld服务定义目录
cat tftp.xml #随便浏览一个服务的定义, 这里选的是 tftp.
cp tftp.xml vsftp.xml #复制xml文件, 命名为vsftp.xml.
nano vsftp.xml #编辑文件

编辑文件, 修改名称,描述,协议和端口的定义, 删除不必要的内容. 得到如下所示.

 
 
 
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>vsFtp</short>
  <description>The Trivial File Transfer Protocol (vsFtp) is a protocol used to transfer files to and from a remote mac$
  <port protocol="tcp" port="20"/>
  <port protocol="tcp" port="21"/>
</service>

保存退出
添加服务到当前区域

 
 
 
1
2
3
4
firewall-cmd --permanent --add-service=vsftp #永久开放vsftp
firewall-cmd --permanent --add-port=30000-50000/tcp #永久开放此端口范围
firewall-cmd --reload #重新加载配置,必要步骤.
firewall-cmd --list-all #列出当前开放的服务与端口

至此, ftp 服务配置完成.




 

(责任编辑:IT)