LAMP是Linux+Apache+MySQL+PHP的缩写,即把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言。Apache是最常用的Web服务软件,而MySQL是比较小型的数据库软件。三个角色可以安装在一台机器上,也可以分开(http服务器和编译环境PHP要在一起)。
在整个网站架构中Web Server(如Apache)只是内容的分发者。如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。当客户端请求的是index.php。
早期的webserver只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言。 webserver处理不了了,怎么办呢?那就交给php解释器来处理。 这时候web server根据配置文件知道这个不是静态文件,需要解析器来处理这个请求。这时候为了解决语言解析器和webserver的通信,需要按照cgi协议来编写程序。
但是使用cgi协议虽然能解决解析器和webserver之间的通信问题,但是webserver每收到一个请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次,这样下来每次创建资源,初始化然后删除资源,容易造成资源的浪费,工作效率也比较底下,这时候出现了改进的版本fast-cgi。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,大大提高了效率。 参考:fast-cgi的工作原理,什么是fast-cgi。
当动态网页需要请求访问数据库文件时,根据网页编写的代码来调用相应的数据库数据,属于开发的范围,这里先不做详细的解析。一套完整的请求下来就是个https的请求。可以参考一次完整的http请求。
所以处理一次动态页面请求,服务器主要经历:Apache处理请求——通过CGI接口访问PHP的的应用程序——PHP应用程序调用PHP解释器执行PHP代码——PHP程序访问调用数据库——最后给客户做反馈。故在LAMP的环境机构中,apache、mariadb和php的主要功能分别如下。
apache主要实现如下功能:
第一:处理http的请求、构建响应报文等自身服务;
第二:配置让Apache支持PHP程序的响应(通过PHP模块或FPM);
第三:配置Apache具体处理php程序的方法,如通过反向代理将php程序交给fcgi处理。
mariadb主要实现如下功能:
第一:提供PHP程序对数据的存储;
第二:提供PHP程序对数据的读取(通常情况下从性能的角度考虑,尽量实现数据库的读写分离)。
php主要实现如下功能:
第一:提供apache的访问接口,即CGI或Fast CGI(FPM);
第二:提供PHP程序的解释器;
第三:提供mairadb数据库的连接函数的基本环境。
由此可知,要实现LAMP在配置每一个服务时,安装功能需求进行配置,即可实现LAMP的架构,当然apache、mariadb和php服务都可配置为独立服务,安装在不同电脑之上。
上文提及的fast-cgi协议可以处理webserver与解析器之间的通信。PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理所以就出现了一些能够调度php-cgi进程的程序,而php-fpm就是一个实现了Fastcgi协议的程序。
PHP作为独立的经常运行,此时根据PHP的三大功能,第一要素:配置httpd,让httpd支持处理PHP程序并知道处理PHP请求时,交由谁来处理,建议在/etc/httpd/conf.d/目录下新建文件,配置支持处理PHP请求,第二要素:提供CGI接口和PHP解释器,此步是由编译时开启此功能,第三要素:配置支持数据库连接,此步也是有编译时开启此功能,因此总结PHP在独立运行的配置方法为:编译初期开启PHP的CGI接口、PHP的解释功能和数据库连接功能模块,在编译完成之后再次调整HTTPD和PHP的连接发放。
PHP-FPM详解
理解完相关的lamp环境后可以开始搭建lamp的环境并且实现wordpress的访问。按照lamp的顺序进行搭建。
##安装mysql服务
[root@izwz95rptd09gfx867uwm6z conf.d]# yum install -y mariadb-server ##安装mysql包
##安装完成后,编辑/etc/my.cnf文件,添加常用参数:
[root@izwz95rptd09gfx867uwm6z etc]# vim my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
nnodb_file_per_table=ON ##使用单独的表
skip_name_resolve=ON ##取消名字解析
~
##修改完后启动mysql服务
[root@izwz95rptd09gfx867uwm6z etc]# systemctl start mariadb
[root@izwz95rptd09gfx867uwm6z etc]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
##创建mysql的相关用户并且链接
[root@izwz95rptd09gfx867uwm6z etc]# mysql -uroot -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 5.5.60-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
##数据库的权限赋值
1、用管理员登陆mysql;
2、创建数据库create database db01;
3、添加用户和用户权限:
Mysql添加用户
使用可以对mysql数据库用户表有操作权限的用户名登陆mysql
insert into user(Host,User,Password) values('%','name','password');
如果work用户没有登陆权限,则
killall mysqld
share/mysql/mysql.server start
grant all on *.* to work@'%' identified by "password";
MySQL赋予用户权限的命令的简单格式为
grant 权限 on 数据库对象 to 用户
grant 权限 on 数据库对象 to 用户 identified by "密码"
用户名:ad,密码:ad_pass,登陆ip:192.168.0.10
//用户在所有登陆ip的权限
grant all on *.* to ad@‘%’ identified by "ad_pass";
//开放管理MySQL中所有数据库的权限
grant all on *.* to ad@'192.168.0.10' identified by "ad_pass";
//开放管理MySQL中具体数据库(test)的权限
grant all privileges on test to ad@'192.168.0.10' identified by "ad_pass";
或
grant all on test to ad@'192.168.0.10' identified by "ad_pass";
//开放管理MySQL中具体数据库中的表(test.table1)的权限
grant all on test.table1 to ad@'192.168.0.10' identified by "ad_pass"
//开放管理MySQL中具体数据库的表(test.table1)的部分列的权限
grant select(id,se,rank) on test.table1 to ad@'192.168.0.10' identified by "ad_pass";
//开放管理操作指令
grant select,insert,update,delete on test.* to ad@'192.168.0.10' identified by "ad_pass";
//回收权限
revoke all on *.* from ad@localhost;
//查看MySQL用户权限
show grants;
show grants for ad@localhost;
##php-fpm服务器的搭建
##安装服务
#php-mysql 连接mysql服务的接口
#php-mbstring 支持多字节的模块
[root@izwz95rptd09gfx867uwm6z etc]# yum install -y php-mysql.x86_64 php-fpm php-mbstring
安装完成后需要配置相关的文件
服务配置文件:/etc/php-fpm.conf,/etc/php-fpm.d/*.conf
php环境配置文件:/etc/php.ini,/etc/php.d/*.ini
[root@izwz95rptd09gfx867uwm6z etc]# vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 #修改监听的端口和IP
listen.backlog = -1 #后援队列,指最大的等待队列,-1表示无限制;
listen.allowed_clients = 127.0.0.1 #授权httpd主机请求
user = apache #监听服务进程的主机,默认以哪个用户身份运行
group = apache
pm = dynamic #定义进程控制器如何生成子进程;有两种方式static和dynamic;
pm.max_children = 50 #最大并发连接数量;
pm.start_servers = 5 #启动时,启动子进程数量;
pm.min_spare_servers = 5 #最少启动空闲子进程数量
pm.max_spare_servers = 35 #最大启动空闲子进程数量;
pm.max_requests = 500 #最大请求数
pm.status_path = /pmstatus #自带的状态输出模块
ping.response = pong #探测返回值
ping.path = /ping #探测服务正常;
php_value[session.save_handler] = files #是否保存php的session及保存格式
php_value[session.save_path] = /var/lib/php/session #保存路径
#创建目录
[root@izwz95rptd09gfx867uwm6z etc]# mkdir -pv /var/lib/php/session
#创建指定目录并更改属主属组
[root@izwz95rptd09gfx867uwm6z etc]# chown apache:apache /var/lib/php/session/
#重启服务
[root@izwz95rptd09gfx867uwm6z etc]# systemctl start php-fpm.service
#确定服务启动并监听 ,看到9000端口已经被监听了
[root@izwz95rptd09gfx867uwm6z etc]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:9000 *:*
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 1 127.0.0.1:32000 *:*
##安装httpd2.4
在httpd服务器上安装httpd服务:
[root@izwz95rptd09gfx867uwm6z ~]# yum install -y httpd
安装完成后,确认是否加载了模块proxy_fcgi_module:
[root@izwz95rptd09gfx867uwm6z ~]# httpd -M |grep fcgi
proxy_fcgi_module (shared) ##已经安装了fcgi的模块
[root@izwz95rptd09gfx867uwm6z ~]# cd /etc/httpd/conf.d/
[root@izwz95rptd09gfx867uwm6z conf.d]# ls -al
total 28
drwxr-xr-x 2 root root 4096 Apr 6 15:50 .
drwxr-xr-x 5 root root 4096 Apr 6 15:50 ..
-rw-r--r-- 1 root root 2926 Nov 5 09:47 autoindex.conf
-rw-r--r-- 1 root root 691 Apr 13 2018 php.conf
-rw-r--r-- 1 root root 366 Nov 5 09:47 README
-rw-r--r-- 1 root root 1252 Oct 30 23:00 userdir.conf
-rw-r--r-- 1 root root 824 Oct 30 23:00 welcome.conf
##编辑创建/etc/httpd/conf.d/fcgi.conf配置文件:
[root@izwz95rptd09gfx867uwm6z etc]# vim /etc/httpd/conf.d/fcgi.conf
DirectoryIndex index.php #设置默认主页为index.php
ProxyRequests off #关闭正向代理
#将以.php结尾的URL代理转发给fcgi://127.0.0.1:9000
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1/var/www/html/$1
ProxyPassMatch ^/(ping|pmstatus)$ fcgi://127.0.0.1:9000/$1
#首先创建对应的存放目录,此处设置与httpd服务上设置的fcgi://192.168.109:9000/var/www/html/$相一致
[root@fpm ~]# mkdir -pv /var/www/html/
[root@fpm ~]# vim /var/www/html/index.php #
[root@fpm ~]# vim /var/www/html/mysql.php
在php-fpm服务器上通过命令下载wordpress的安装包并解压复制到/var/www/html目录下:
[root@fpm ~]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@fpm ~]# tar -xf wordpress-4.9.4-zh_CN.tar.gz
[root@fpm ~]# cp -a wordpress /var/www/html/
[root@fpm ~]# chown -R apache:apache /var/www/html/wordpress/
访问wordpress并且设置
DML – Data Manipulation Language
数据库操作语言:SQL中处理数据库中的数据;其主要命令有SELECT,INSERT,UPDATE,DELETE等
服务器端的命令除了DML,还有DDL(Data Definition Language)数据定义语言;DCL(Data Control Language)数据控制语言;TCL(Transaction Control Language)事务控制语言
DML:数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE、SELECT,分别代表插入、更新、删除与查询,是开发以数据为中心的应用程序必定会使用到的指令
获取命令帮助:mysql> help KEYWORD
先创建数据表
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> create database test1;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use test1
MariaDB [test1]> create table test (id varchar(10),name (varchar(10));
插入语句Insert:INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);
说明:
“字段名1,字段名2,…”表示数据表中的字段名称,此处应为表中所有字段名称。
“值1,值2…”表示每一个字段的值,其值顺序、类型须与对应的字段相匹配!
注意:
使用inset语句添加记录时,表名后的字段顺序可以与在其表中定义的顺序不一致,他们需要与values中值得顺序一致即可!
方式二:insert语句中不指定字段名。
其实,他就是在不指定字段名的情况下,直接用values为其默认赋值。
注意:
正因为没有字段名,则values中值得顺序必须与字段在表中顺序一致。
基本语法:
INSERT INTO 表名 VALUES(值1,值2,....);
MariaDB [test1]> insert into test values("10","xiaoqiang");
Query OK, 1 row affected (0.00 sec)
查询语句Select: select 查询内容
from 表名
where 表达式
group by 字段名
having 表达式
order by 字段名
limit 记录数
1. from 表名 指定是从那张表中查询
2. select 查询内容
查询所有字段 select * from 表名;
*通配符:表示所有字段
mysql> select * from test;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | A | 4 |
| 2 | B | 7 |
| 3 | C | 5 |
| 4 | D | 12 |
+------+------+------+
4 rows in set (0.06 sec)
查询部分字段 select 字段名 from 表名;
mysql> select name from test;
+------+
| name |
+------+
| A |
| B |
| C |
| D |
+------+
4 rows in set (0.00 sec)
在MySQL表中,每个字段的数据可以当做变量处理。
查询所需的某个字段数据处理后的结果:select 字段处理方式 from 表名;
mysql> select age-3 from test;
+-------+
| age-3 |
+-------+
| 1 |
| 4 |
| 2 |
| 9 |
+-------+
4 rows in set (0.11 sec)
3. where 表达式 (按条件查询)
在MySQL的表查询时,往往并不是需要将所有内容全部查出,而是根据实际需求,查询所需数据
select 查询内容 from 表名 where 表达式;
在MySQL语句中,条件表达式是指select语句的查询条件,在where子句中可以使用关系运算符连
接操作数作为查询条件对数据进行选择。
关系运算符:
= 等于
<> 不等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
例如查询年龄大于5的信息
mysql> select * from test where age > 5;
+------+------+------+
| id | name | age |
+------+------+------+
| 2 | B | 7 |
| 4 | D | 12 |
+------+------+------+
2 rows in set (0.04 sec)
带in的关键字查询
查询某个指定集合内的记录 select 查询内容 from 表名 where 条件 in(指定内容);
mysql> select * from test where age in (5, 12);
+------+------+------+
| id | name | age |
+------+------+------+
| 3 | C | 5 |
| 4 | D | 12 |
+------+------+------+
2 rows in set (0.00 sec)
带有between and 关健字查询
查询某个在给定范围内的记录 select 查询内容 from 表名 where 条件 between 值1 and 值2;
mysql> select * from test where age between 5 and 12;
+------+------+------+
| id | name | age |
+------+------+------+
| 2 | B | 7 |
| 3 | C | 5 |
| 4 | D | 12 |
+------+------+------+
3 rows in set (0.07 sec)
查询某些为空NULL 或 非空的记录 select 查询内容 from 表名 where 条件 is(not) NULL;
mysql> select * from test where age is NULL;
+------+------+------+
| id | name | age |
+------+------+------+
| 6 | F | NULL |
+------+------+------+
1 row in set (0.00 sec)
在查询时过滤掉重复的值:select distinct 字段名 from 表名;字段名表示要过滤重复记录的字段
mysql> select num from a;
+------+
| num |
+------+
| 5 |
| 10 |
| 15 |
| 10 |
| 15 |
| 5 |
| 10 |
+------+
7 rows in set (0.00 sec)
mysql> select distinct num from a;
+------+
| num |
+------+
| 5 |
| 10 |
| 15 |
+------+
3 rows in set (0.00 sec)
在使用distinct指定多个字段时,只有被指定的这些字段的值都相同,才会被认为是重复的
在查询具有一类相同特征的数据时,需要用到模糊查询,这是就需要使用like关键字
select 查询内容 from 表名 where 内容 (not) like ‘匹配的字符串’
百分号通配符 %:表示匹配任意长度的任意字符串
mysql> select name from name;
+------+
| name |
+------+
| 1112 |
| 1122 |
| 1222 |
| 2111 |
+------+
4 rows in set (0.00 sec)
mysql> select name from name where name like '11%';
+------+
| name |
+------+
| 1112 |
| 1122 |
+------+
2 rows in set (0.00 sec)
下划线通配符 _ :表示匹配任意单个字符,如果需要匹配多个字符,则需要使用多个 _
mysql> select name from name where name like '11__';
+------+
| name |
+------+
| 1112 |
| 1122 |
+------+
2 rows in set (0.00 sec)
如果需要查询带有 % 或 _ 的数据,由于 % 和 _ 是通配符,则需要使用 \ 进行转义
\% 表示 %,\_ 表示 _
有时在查询时为了查询结果更加精确,需要多个限条件,这时就需要 and(&&) 来连接条有时在查询时,只需要数据满足某些条件中的某一个,这时就需要使用 or(||) 来连接条。注意:在查询时,and 的优先级高于
Where 与 having:
where 与 having关键字都用于设置条件表达式对查询结果进行过滤,区别是having后面可以跟聚合
函数,而where不能,通常having关键字都与group by 一起使用,表示对分组后的数据进行过滤。
删除语句Delete:
delete删除语句 from指定表 test 表名 where 过滤条件 name="xiaoqiang" 过滤条件
MariaDB [test1]> delete from test where name="xiaoqiang"
-> ;
Query OK, 1 row affected (0.00 sec)
修改语句:UPDATE:UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1=value1 [, col_name2=value2] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
FTP,File transfer Protocl即文件传输协议,是用于在网络中控制文件的双向传输的协议。FTP协议运行在TCP/21和20端口,通常来说21端口是命令端口、20端口是数据端口,但根据FTP的工作模式的不同,数据端口也有可能跟着改变。+
数据传输连接由服务器主动创建,客户端先随机一个端口N,用这个的端口连接服务器的21端口来完成命令连接的建立,之后服务器以tcp的20端口主动连接客户端的N+1端口来进行数据传输连接.
如上图所示,在主动模式下,FTP客户端从任意端口5150(端口号>1023)发起一个FTP请求,并携带自己监听的端口号5151(发送的端口号+1=监听端口号);随后服务器返回确认,然后从服务器本地的20端口主动发起连接请求到客户端的监听端口5151,最后客户端返回确认。
这种模式缺点在于服务器带客户端的FTP连接很容易被传输过程中的路由器、防火墙所影响或拦截。
为了主动模式所面临的服务器到客户端的连接会被拦截阻塞的问题,FTP发展出了被动模式。在被动模式中,命令连接和数据连接都由客户端来发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙拦截的问题。
如上图所示,客户端用随机命令端口5150向服务器的21命令端口发送一个PASV请求,然后服务器返回数据端口3267,告诉客户端我在哪个端口监听数据连接。然后客户端向服务器的监听端口3268发起数据连接,最后服务器回复确认ok。
ftp的一些常用配置信息:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
Systemd Unit File :/usr/lib/systemd/systemd/vsftpd.service
禁止登陆用户列表:/etc/vsftpd/ftpusers
用户列表/etc/vsftpd/user_list
匿名用户:
anonymous_enable=YES #是否开启匿名用户
anon_upload_enable=YES #是否具有上传权限
anon_mkdir_write_enable=YES #是否可以创建目录
anon_other_write_enable=YES #除了写权限是否可以删除修改服务器上的其他文件
anon_umask=077 #文件的掩码权限
系统用户:
local_enable=YES #是否启用本地用户
write_enable=YES #是否具有可写权限
local_umask=022 #文件的掩码权限
userlist_enable=YES #启用/etc/vsftpd/user_list文件来控制可登录用户
userlist_deny=
YES:意味着此为黑名单
NO:白名单(名单中的用户才能登陆)
chroot_local_user=YES
禁锢所有本地用户 于其家目录之中;(需要事先去除用户对家目录的写权限)
chroot_list_enable=YES #启用家目录禁锢列表功能
chroot_list_file=/etc/vsftpd/chroot_list
禁锢列表中文件存在的用户于其家目录中;(需要事先去除用户对家目录的写权限)
pam:
可插入式认证模块,高度模块化,可以查询系统的认证模块.
虚拟用户模式登录ftp所用到的用户不是系统本地用户,这些虚拟用户只能对ftp服务器中的文件有写权限而不能对系统中的其他资源有访问权限,提高了安全性.这是又就使用pam模块了做认证.
创建mysql数据库用户
MariaDB [(none)]> use vsftp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [vsftp]> insert into users(name,password) value ('test1',password('123'));
Query OK, 1 row affected (0.00 sec)
MariaDB [vsftp]> select * from users
-> ;
+----+-------+-------------------------------------------+
| id | name | password |
+----+-------+-------------------------------------------+
| 1 | test1 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+----+-------+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB [vsftp]> exit
搭建ftp服务
[root@128 ~]# yum groupinstall -y "Development Tools" "Server PlatformDevelopment" #安装包组
[root@128 ~]# yum install vsftpd ftp wget -y #安装vsftp、wget、ftp客户端
[root@128 ~]# yum install mariadb-devel pam-devel openssl-devel -y #安装相关扩展
[root@128 ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@128 ~]# tar -xf pam_mysql-0.7RC1.tar.gz #解压
[root@128 ~]# cd pam_mysql-0.7RC1/ #编译安装
[root@128 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
[root@128 pam_mysql-0.7RC1]# make && make install
[root@128 ~]# ll /lib64/security/ #检验安装
-rwxr-xr-x. 1 root root 882 Oct 26 10:46 pam_mysql.la
-rwxr-xr-x. 1 root root 141680 Oct 26 10:46 pam_mysql.so
[root@128 ~]# vim /etc/pam.d/vsftpd.mysql #创建pam认证
auth required /usr/lib64/security/pam_mysql.so user=vsftp passwd=redhat host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftp passwd=redhat host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
配置字段说明:
auth 表示认证;
required 表示认证要通过;
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数;
user=vsftpd为 登录mysql的用户;
passwd=redhat 登录mysql的的密码;
host=192.168.32.132 在mysql中定义的允许连接的主机名或ip地址;
db=vsftpd 连接msyql的哪一个库;
table=users 连接库里的哪一个表;
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密;
#创建系统用户用来作为映射虚拟用户时使用
[root@128 ~]# useradd -s /sbin/nologin -d /ftproot vuser
#确保用户的家目录,让其它远程访问的用户能读、执行权限,这样才能cd进此目录;
[root@128 ~]# chmod go+rw /ftproot/
[root@128 ~]# chmod u-w /ftproot/
#配置vsftpd
[root@128 vsftpd]# vim /etc/vsftpd/vsftpd.conf
………………..
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vuser
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusrs_conf
#配置虚拟用户具有不同的访问权限:
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
[root@128 ~]# mkdir /etc/vsftpd/vusrs_conf
[root@128 ~]# cd /etc/vsftpd/vusrs_conf/
[root@128 vusrs_conf]# vim test1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
重启 vsftpd 服务,即可完成vsftpd+pam+mariadb体系
简介
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。
NFS服务的优缺点
优点:
节省本地存储空间,将常用的数据存放在一台可以通过网络访问的服务器上
简单容易上手
方便部署非常快速,维护十分简单
缺点:
容易发生单点故障,需要做备份处理
在高并发环境中效率性能有限
客户端没有认证机制,数据通过明文传输,缺乏安全性
对数据的完整性不做验证
多台机器挂载NFS服务器时,连接管理维护比较麻
NFS工作原理介绍:
因为NFS的各项功能都需要向RPC服务注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号、PID、监听地址等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口。
也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。
首先安装nfs服务:
[root@izwz95rptd09gfx867uwm6z ~]# yum install -y nfs-utils
#关闭firewalld及设置selinux为permissive,避免它们对测试效果造成影响:
[root@izwz95rptd09gfx867uwm6z ~]# systemctl stop firewalld
[root@izwz95rptd09gfx867uwm6z ~]# setenforce 0
创建NFS共享目录:
[root@izwz95rptd09gfx867uwm6z ~]# mkdir /nfs_dir
[root@izwz95rptd09gfx867uwm6z ~]# vim /nfs_dir/README
Welcome to the nfs.
NFS服务的配置
与NFS服务相关的配置文件有:
配置文件:/etc/exports
配置文件目录:/etc/exports.d
NFS服务的主配置文件为/etc/exports,用于定义共享的目录以及访问NFS共享目录的客户端的权限,其格式如下:
/PATH/TO/SOME_DIR clients1(export_options,...) clients2(export_options,...)
其中clients支持以下几种格式:
single host:ipv4,ipv6,FQDN; network:address/netmask,支持长短格式的掩码
wildcards:主机名通配,例如,*.magedu.com
netgroups:NIS域内的主机组,@group_name
anonymous:使用*通配所有主机
而export_options的常见参数可以分为以下两类:
General Options:
ro:客户端挂载后,其权限为只读,默认选项;
rw:读写权限;
sync:同时将数据写入到内存与硬盘中;
async:异步,优先将数据保存到内存,然后再写入硬盘;
Secure:要求请求源的端口小于1024;
User ID Mapping:
root_squash:当NFS客户端使用root用户访问时,映射到NFS服务器的匿名用户;
no_root_squash:当NFS客户端使用root用户访问时,映射到NFS服务器的root用户;
all_squash:全部用户都映射为服务器端的匿名用户;
anonuid=UID:将客户端登录用户映射为此处指定的用户uid;
anongid=GID:将客户端登录用户映射为此处指定的用户gid;
其它可用参数可通过命令man exports
查看帮助手册。
此处我们按照如下配置NFS服务的配置文件:
[root@izwz95rptd09gfx867uwm6z ~]# vim /etc/exports
/nfs_dir 192.168.0.*(rw,sync,root_squash)
随后分别启动rpcbind服务和nfs-server服务,使用yum安装nfs-utils时已经默认安装了rpcbind服务,所以无需再次安装,注意要先启动rpcbind服务再启动nfs-server服务:
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs-server
3、挂载NFS共享目录
随后我们在另一台Linux测试主机上对NFS共享的文件系统进行挂载测试:
[root@izwz95rptd09gfx867uwm6z ~]# showmount -e 192.168.0.84 #可查看NFS服务器所有的共享目录
[root@izwz95rptd09gfx867uwm6z ~]# mount -t nfs 192.168.0.84:/nfs_dir /mnt
[root@izwz95rptd09gfx867uwm6z ~]# cd /mnt/
[root@izwz95rptd09gfx867uwm6z ~]# ll
总用量 4
-rw-r--r--. 1 root root 20 5月 7 2018 README
[root@test mnt]# touch hello
touch: 无法创建"hello": 只读文件系统
[root@izwz95rptd09gfx867uwm6z ~]# cat README
Welcome to the nfs.
通过上述测试发现无法在挂载的共享目录下创建文件,明明NFS服务配置文件中有rw权限。其实这是因为root_squash参数导致的,因为此时测试客户端的登录账号为root,那么在访问NFS共享目录的时候,因此root_squash参数,导致权限被压缩为nobody权限,自然无法对该目录进行写入操作。
此时只需要对NFS的配置文件进行修改,然后重新导出NFS目录即可:
[root@nfs ~]# vim /etc/exports
/nfs_dir 192.168.0.*(rw,sync,no_root_squash) #修改为no_root_squash参数
#使用exportfs参数,重新导出所有文件系统,相当于重读NFS配置,但不需要重启服务
[root@nfs ~]# exportfs -arv
exporting 192.168.0.*:/nfs_dir
此时再次在测试主机上测试:
[root@izwz95rptd09gfx867uwm6z ~]# touch filetest #创建文件成功
[root@izwz95rptd09gfx867uwm6z ~]# ll
总用量 8
-rw-r--r--. 1 root root 0 5月 7 2018 filetest #创建的文件的属主和属组为root
-rw-r--r--. 1 root root 7 5月 7 2018 hello
-rw-r--r--. 1 root root 20 5月 7 2018 README
[root@test mnt]# rm hello #删除文件成功
rm:是否删除普通文件 "hello"?y
nfs问题可以参考NFS常见问题
1.简介
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。例如Windows和Linux,Windows和Unix等,这时可以使用sanba服务器来解决这个问题。
功能:
文件系统共享;
打印机共享;
支持NetBIOS协议:可使Linux主机出现在window是中的网络邻居上;
而由于NETBIOS协议对于windows来讲监听TCP的139端口和UDP的137,138端口 ,所以nmbd在linux上模拟出了udp的137和138端口,以及tcp的139端口,smdb上模拟出 tcp的445端口。而SAMBA将在Linux上同时监听这4个端口。
[root@izwz95rptd09gfx867uwm6z ~]# yum install samba -y
[root@izwz95rptd09gfx867uwm6z ~]# rpm -ql samba
/usr/sbin/nmbd 实现名称服务
/usr/sbin/smbd 实现文件共享服务
/etc/pam.d/samba 借助于pam实现认证
/usr/lib/systemd/system/nmb.service 启动的服务
/usr/lib/systemd/system/smb.service 启动的服务
[root@izwz95rptd09gfx867uwm6z ~]# rpm -ql samba-common
其中:
/etc/samba/lmhosts #完成NetBIOS主机名称映射
/etc/samba/smb.conf #客户端与服务端通用的主配置文件
对于/etc/samba/smb.conf文件常见参数及分类如下:
[global]
workgroup = MYGROUP #工作组名
server string = Samba Server Version %v #服务器信息介绍
netbios name = MYSERVER #用netbios名来指定服务
interfaces = [interface1 interface2...|address1 address2...] #用于让samba服务监听多个网络接口或IP
hosts allow = [address1 address2...] #指定允许访问的主机IP
log file = /var/log/samba/log.%m #指定日志存放路径,%m为来访的主机名
max log size = 50 #定义日志文件最大容量为50K
security=user #设置samba服务的安全认证方式为user
设定安全级别:取值有四个;
share:匿名共享;
user:使用samba服务自我管理的账号和密码进行用户认证;用户必须是系统用户,但密码非为/etc/shadow中的密码,而由samba自行管理的文件,其密码文件的格式由passdb backend进行定义;
server:由第三方服务进行统一认证;
domain:使用DC进行认证;基于kerberos协议进行;
passdb backend=tdbsam #定义用户后台的类型为tdbsam,其他类型还有smbpasswd、ldapsam
load prints = yes # #设置是否共享打印机
cups options = raw #打印机选项
共享文件系统配置
[SHARED_NAME]
有三类:
[homes]:为每个samba用户定义其是否能够通过samba服务访问自己的家目录;
[printers]:定义打印服务;
[shared_fs]:定义共享的文件系统;
常用指令:
comment:注释信息;
path:当前共享所映射的文件系统路径;
browseable:是否可浏览,指是否可被用户查看;
guest ok:是否允许来宾账号访问;
public:是否公开所有用户;
writable:是否可写;
read only:是否为只读;
write list:拥有写权限的用户列表;
用户名
@组名
3.samba服务安装配置
#首先清空防火墙,关闭selinux
[root@izwz95rptd09gfx867uwm6z ~]# iptables -F
[root@izwz95rptd09gfx867uwm6z ~]# setenforce 0
[root@izwz95rptd09gfx867uwm6z ~]# mkdir /magedu #创建共享文件
#编辑配置文件
[root@izwz95rptd09gfx867uwm6z ~]# vim /etc/samba/smb.conf
#添加以下配置
[magedu]
comment=magedu
path=/magedu
guest ok=yes
read only=no
[root@128 ~]# testparm #校验配置文件是否正确
samba服务默认的验证模式为user,因此我们还需要创建用户的数据库。
-a USERNAME:创建samba用户;
-x:删除samba用户;
-L:列出samba用户列表;
-Lv:列出用户详细信息列表;
-a:添加账号
-x:删除账号
-d:禁用账号
-e:启用账号
[root@izwz95rptd09gfx867uwm6z ~]# useradd samba
[root@izwz95rptd09gfx867uwm6z ~]# pdbedit -a samba
[root@izwz95rptd09gfx867uwm6z ~]# pdbedit -a samba
new password:
retype new password:
Unix username: samba
NT username:
Account Flags: [U
……………………………….
[root@izwz95rptd09gfx867uwm6z ~]# systemctl start smb
在linux客户端上连接
[root@www ~]# mount -t cifs //47.107.76.255/magedu /smb -o username=samba,password=a27674240
[root@www ~]# mount
…………………………
//192.168.32.128/magedu on /smb type cifs (rw,relatime,vers=1.0,cache=strict,username=samba,domain=128,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.32.128,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=65536,echo_interval=60,actimeo=1)
[root@www smb]# [root@www smb]# touch 121
[root@www smb]# ll
total 0
-rw-r--r--. 1 2004 2004 0 Oct 26 14:16 121
drwxr-xr-x. 2 2004 2004 0 Oct 27 2018 qqq