java 编写简易的http服务器

java 编写简易的http服务器
想要写一个http服务器,首先得了解http协议。这里仅介绍一下相关的知识。

1、http协议
HTTP请求报文
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。其中方法、URI、HTTP版本作为首行,然后每个HTTP首部字段为一行,以上内容简称为请求头,如下请求头:

GET /favicon.ico HTTP/1.1 //首行,GET为请求方法,favicon.ico为url链接,1.1版本号
Host: 172.30.67.185:8080 //以下为首部字段行
Connection: keep-alive
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
注:请求报文一般由浏览器(客户端)向服务器发送

HTTP响应报文
在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段3部分构成,其中HTTP版本、状态码作为首行,然后每个HTTP首部字段为一行,以上内容简称为响应头,如下响应头:

HTTP/1.1 200 OK //首行,1.1为版本号,200为状态码。以下行为首行字段
Content-Type:text/html;charset=utf-8

//空一行后,响应客户端的内容,后面会讲
注:请求报文一般由服务器向浏览器(客户端)发送

2、简单的http服务器
服务器启动程序
首先,编写一个服务器启动程序,我们监听了8080端口,然后得到socket对象,接着new SocketServer(s),然后启动线程。线程池简单看作启动线程的工具就行了(需要深入了解线程池的自行百度)。

public static void main(String[] args) {
ServerSocket server=null;
//线程池,简单来说,就是把线程start()改成ex.execute(),然后可以提高服务器性能
ExecutorService ex=Executors.newFixedThreadPool(20);
try {
//建立服务器监听端口
server=new ServerSocket(8080);
while(true) {
Socket s=server.accept();
//然后把接收到socket传给SocketServer并执行该线程
ex.execute(new SocketServer(s));
}
} catch (IOException e) {
e.printStackTrace();
}
}
接着,因为我们的SocketServer需要做的是做一个http服务器,所以重点来了!怎么接受浏览器(客户端)传来的请求呢?然后又怎么给浏览器(客户端)响应内容呢?

http服务器类
因为浏览器(客户端)的请求方法有GET、POST等,在这里,先写一个响应GET的请求。

思路:

1、打开socket对象的输入流,接收浏览器(客户端)的请求头

2、分析字段内容,判断请求方法、链接

3、打开socket对象的输出流,在输出流里写入响应头

4、空一行,写入响应内容。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class SocketServer implements Runnable{
Socket s;
//构造方法
public SocketServer(Socket s) {
this.s=s;
}
//线程
public void run(){
//输入输出流
OutputStream os=null;
InputStream in=null;
try
{ //打开socket输入流,并转为BufferedReader流
in=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));

//接收*行,得到请求路径
String requestHeader;
requestHeader=br.readLine();
int begin = requestHeader.indexOf(“/”)+1;
int end = requestHeader.indexOf(“HTTP/”);
String url=”E:\\sublime文件\\Html文件\\第二天案例\\”;
url=url+requestHeader.substring(begin, end);

//打开socket对象的输出流,写入响应头
os = s.getOutputStream();
os.write(“HTTP/1.1 200 OK\r\n”.getBytes());
os.write(“Content-Type:text/html;charset=utf-8\r\n”.getBytes());
os.write(“\r\n”.getBytes());

//空一行,写入响应内容。
File f=new File(url);
if(f.exists()) //判断请求的文件是否存在
{
FileInputStream fin=new FileInputStream(f);
byte []b=new byte[1024];
int len;
while((len=fin.read(b))!=-1)
{
os.write(b,0,len);
}
}
os.flush();
//如果os流没有关闭的话,浏览器会以为内容还没传输完成,将一直显示不了内容
os.close();

}

}
实现过程非常简单,简单到没有判断浏览器(客户端)的请求方法,直接返回了一个请求路径的文件。

Java版服务器开发总结

今天打算对之前进行多年的Java版服务器端开发进行下技术总结,以供大家参考。

个人对服务器开发基础框架平台有以下几点总结(会随时更新):

1、 网络设计(BIO(java.net包)和NIO(java.nio.channels包)两种方式,参考MINA(C/S), JETTY(B/S)、jsockets和jniosocket等开源项目)(参考资料O’reilly系列网络编程)

2、 传输协议设计(http、https、ftp、smtp等协议和自定义传输协议,基于TCP/IP协议之上)

3、 I/O处理设计(字节流(java.io包)和字符流到Buffer(java.nio包)缓冲区,*后把可以扩展到stream object 转换成POJO,将POJO转换成stream object的范围)(参考O’reilly系列的IO和NIO两本书籍)

4、 可以扩展的XML设计(可以跟其它语言(C++等)开发的系统进行交互请求信息,也是一种很重要的手段,包括解析(JDOM、DOM、SAX、DOM4j等)、生成、语言格式)

5、 管理设计(JMX(参考资料O’reilly系列JMX书籍。javax.management包),JFOXMX、MX4J开源项目)

6、 消息设计(JMS(参考资料O’reilly系列JMS书籍),OPENJMS开源项目)

7、 安全设计(访问控制器、数据加密、数据传输保护和授权(javax.crypto包)参考资料 O’reilly系列java安全书籍、传输加密(javax.net包)等)

8、 缓存设计(JCS(内存缓冲、索引式硬盘缓冲、并行式的分布缓冲和Client/Server式的缓冲)、CACHE4J、EOCACHE等)

9、 多线程池设计(concurrent开源项目,对应java.util.concurrent包)

10、事务处理(包括分布式事务处理)设计(暂缺,可能包含在15和12中==)

11、资源池(数据库连接池、socket连接池、线程池等)、对象池等开销大的资源设计 (可以参考比较优秀的开源项目中设计,可以完善自己的设计思想)

12、数据持久化设计(JDBC、Mybatis、JDO、HIBERNATE、Ibatis等开源项目)

13、WEB框架设计(基础框架SERVLET、SOAP技术。STRUTS、WEBWork、FLEX、WPF、JSF、AJAX、TAPESTRY等开源项目)

14、处理机制的异步设计(责任链设计、流水线设计等)

15、扩展到分布式设计(RMI(参考资料O’reilly系列RMI书籍java.rmi包)、JTA等)

16、扩展到命名空间设计(JNDI(参考资料The JNDI Tutorialjavax.naming包))

17、对象重用设计(这是在代码中要注意的,个人根据经验分析,需要每次创建的对象是请求对象和结果对象,中间过程的所需要的功能对象一般都可以做成重用的方式)

18、JVM的参数优化(类加载技术(包含热部署)属于外部部署,ANT开源项目,Maven)

19、服务器部署的目录结构:BIN、CONF、LIB、LOG目录等。

20、业务逻辑处理设计(根据实际情况来进行,SPRING、EJB、JDON等),严格的来说是另一个范畴。

21、组件设计(属于一些特定领域应用,例如JYTHON、JAVACC、HSQLDB、QUARTZ等开源项目)

22、通过在实际的使用过程中积累经验(解决使用中出现的问题)。

个人认为多核CPU的出现,今后的会发展成并行处理的设计方式和分布式等多个技术发展方面。目前才认识到大学里的基础知识给服务器开发(应该是很多方面)提供了很多基础设计的思想。

9和11可以合并。

10和12本人感觉有点像是业务逻辑处理的数据层面的东西,但还不能确定。

18和19可以合并成一部分,因为都是属于部署方面的。

主要相关技术归类:

%title插图%num

超详细Linux配置DHCP服务器

概述

DHCP(DynamicHost ConfigurationProtocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

工作原理

1、客户端开机没有IP,局域网内需要发送一个广播形式的DISCOVER(局域网内不知道谁是DHCP服务器),只要能收到的DHCP都能响应

2、如果发现DHCP服务器 此时发现了有多个服务器,每个DHCP服务器都会发送一个OFFER(分配IP地址,但是仅仅是IP),客户端接收IP的时候,会通过ARP协议验证一下,是否被其他主机占用,客户端一般会选择*个给OFFER的DHCP服务器。

3、此时DHCP服务器会发送一个DHCP服务器的REQUESRT的广播包(发送REQUEST,①确定已经选定了此服务器②不仅给自己选定的DHCP服务器发送,还会给此服务器以外的DHCP服务器,声明已经选定好了DHCP服务器。)

4、此时DHCP通过ACK机制会正式的将IP、网关、子网掩码等信息都分配给客户端

关于续租:

DHCP服务器可以24小时开机提供服务,此时有一个问题,客户端在关机期间,再次开机能否再使用之前的IP?

①原来使用的IP没有被占用,回应一个ACK,但是不能永久使用,IP地址的租期达到50%后,必须重新更新租期

②原来使用的IP已经被占用,回应一个NACK,此时客户端重新发送广播,按上面四次协议重新走一遍

总结:DISCOVER和OFFER都是广播,四个阶段全是广播。

DHCP的分配方式

1、自动分配:分配到一个IP地址后永久使用

2、手动分配:由DHCP服务器管理员专门指定IP地址

3、动态分配:使用完后释放该IP,供其他客户机使用

DHCP的优点

1、减少管理员的工作量

2、避免IP地址冲突

3、当前网络更改IP地址段时,不需要再重新配置每个用户的IP地址

4、提高IP地址的利用率

5、方便客户端的配置

DHCP分配的地址信息主要包括

网卡的IP地址、子网掩码

对应的网络地址、广播地址

默认网关地址

DNS服务器地址

实验环境

系统环境:centos6.5

宿主机IP地址:192.168.1.20

使用的rpm包:dhcp-4.1.1-38.P1.el6.centos.x_86_64.rpm

搭建步骤

一、设置DHCP地址池分配IP

1、Server端安装DHCP服务rpm包

1
[root@raid ~] # cd /mnt/sr0/Packages/
1
[root@raid Packages] # rpm -ivh dhcp-4.1.1-38.P1.el6.centos.x86_64.rpm

2、查看主配置文件

[root@raid dhcp] # vim dhcpd.conf #查看主配置文件

3、优化配置文件并编辑

[root@raid ~] # cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf #重新覆盖配置文件

[root@raid ~] # vim /etc/dhcp/dhcpd.conf #修改主配置文件

4、客户端测试

[root@localhost ~] # vim /etc/sysconfig/network-scripts/ifcfg-eth0  #修改eth0网卡信息

二、为指定主机分配IP

1、查看Client端的网卡MAC地址

2、打开server端dhcp主配置文件

[root@raid ~] # vim /etc/dhcp/dhcpd.conf

Linux系统上实现定时重启Tomcat服务

因为使用阿里云部署服务器应用时,Tomcat服务经常由于内存不足出现OutOfMemoryError异常的情况。经常过几天就需要重启一次服务器,更要命的是不知道什么时候会由于内存不足导致无法访问,如果重启不及时严重影响系统体验。

为了解决上述问题,一方面是对tomcat配置做一些优化,网上有很多文章讲解如何优化Tomcat内存设置;另一方面就是写一个shell脚本,每天定时重启Tomcat服务。这里主要记录一下如何写shell脚本并且配置定时任务。本人使用的环境是阿里云Ubuntu服务器,以下配置在阿里云的Ubuntu服务器上能正常运行。

一、创建Shell脚本
新建一个tomcat.sh文件,输入以下内容:

#!/bin/bash
. /etc/profile
tomcatPath=”/usr/local/tomcat”
binPath=”$tomcatPath/bin”
echo “[info][$(date +’%F %H:%M:%S’)]正在监控tomcat,路径:$tomcatPath”
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v ‘grep’ | awk ‘{print $2}’`
if [ -n “$pid” ]; then
echo “[info][$(date +’%F %H:%M:%S’)]tomcat进程为:$pid”
echo “[info][$(date +’%F %H:%M:%S’)]tomcat已经启动,准备使用shutdown命令关闭…”
$binPath”/shutdown.sh”
sleep 2
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v ‘grep’ | awk ‘{print $2}’`
if [ -n “$pid” ]; then
echo “[info][$(date +’%F %H:%M:%S’)]使用shutdown命令关闭失败,准备kill进程…”
kill -9 $pid
echo “[info][$(date +’%F %H:%M:%S’)]kill进程完毕!”
sleep 1
else
echo “[info][$(date +’%F %H:%M:%S’)]使用shutdown命令关闭成功!”
fi
else
echo “[info][$(date +’%F %H:%M:%S’)]tomcat未启动!”
fi
echo “[info][$(date +’%F %H:%M:%S’)]准备启动tomcat…”
$binPath”/startup.sh”
脚本的逻辑比较简单,先查看tomcat进程是否存在,如果不存在则直接调用startup.sh命令启动tomcat,如果tomcat的进程存在则调用shutdown.sh命令停掉tomcat服务,有时会关闭失败,所以在检查一下tomcat进程时候还存在,如果存在就使用kill命令杀掉该进程,然后启动tomcat。
这里有一个地方需要注意,第二行代码(. /etc/profile)不能省掉,需要将环境变量引入到当前脚本环境中,要不然会导致启动定时任务时运行脚本失败,会报以下错误:

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
二、修改文件权限
要让脚本可以执行,当然要把文件设置为可执行文件了。

chmod 777 tomcat.sh
三、建立定时任务
在控制台上输入使用crontab -e 命令进入编辑crontab脚本,*次输入该命令时需要选择编辑器。
%title插图%num

选择vim编辑器编辑就可,在文件后面增加一条任务。(我的脚本文件路径是:/home/script/tomcat.sh)

%title插图%num

然后保存并退出即可,接着使用crontab -l命令即可看到刚才新增的定时任务在列表里面。一般情况是直接生效,如果没有生效可以使用sudo service cron restart命令重启定时任务。

sudo service cron restart
四、定时任务描述语法
crontab中每一个定时任务的格式由6部分组成,分别是分钟、小时、天、月、星期以及命令,前5部分用来配置任务触发时机,中间使用空格隔开,如下:
minute hour day month dayofweek command

minute – 表示分钟,值的范围是从0到59的整数
hour – 表示小时,值的范围是从0到23的整数
day – 表示天,值的范围是从1到31的整数
month – 表示月,值的范围是从1到12的整数
dayofweek – 表示星期,值的范围是从0到6的整数 (0表示周日)
command – 需要执行的命令(/home/script/tomcat.sh > /home/script/shlog.txt表示执行tomcat.sh脚本,并且把结果日志打印到shlo.txt中)
时间部分除了使用估计数字以外还可以配合星号(*),逗号(,),斜杠(/),横杠(-)组合来表示其他意义。

1. 星号(*)
表示任意值,比如:

30 01 * * * command #每天的1:30执行命令
2. 逗号(,)
表示指定的时间,比如:

30 01 1,10,20 * * command #每月的1号、10号、20号的1:30分执行命令
3. 斜杠(/)
表示每隔多长时间,比如:

* */2 * * * command #每个2小时执行一次命令
4. 横杠(-)
表示连续时间,比如:

* 1-7/1 * * * command #凌晨1点-7点之前每隔一小时执行一次命令
五、其他
以上哪里写的不对或者有待改进,欢迎大家提意见,谢谢!
下载地址:tomcat.sh

生产环境如何重启tomcat

如果是系统安装,可以直接用服务管理脚本进行, 如ubuntu在/etc/init.d/tomcat8

主要思路是先用start-stop-daemon发停止信号结tomcat进程, 如果不能顺利结束, 再用kill杀掉进程.
使用方法是

$ sudo service tomcat8 stop
1
如果你自己用脚本管理,也可以参考这个思路, 贴上停止脚本片段供你参考:

stop)
log_daemon_msg “Stopping $DESC” “$NAME”

set +e
if [ -f “$CATALINA_PID” ]; then
start-stop-daemon –stop –pidfile “$CATALINA_PID” \
–user “$TOMCAT8_USER” \
–retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg “$DESC is not running but pid file exists, cleaning up”
elif [ $? -eq 3 ]; then
PID=”`cat $CATALINA_PID`”
log_failure_msg “Failed to stop $NAME (pid $PID)”
exit 1
fi
rm -f “$CATALINA_PID”
rm -rf “$JVM_TMP”
else
log_progress_msg “(not running)”
fi
log_end_msg 0
set -e
;;

Tomcat服务器如何重启

非安装版的:
找到tomcat正确路径,然后:
运行 bin/shutdown 关闭Tomcat服务
再运行 bin/startup 启动Tomcat服务

安装版的:
可以在服务里面找到Apache Tomcat,将启动类型改为你需要的类型。

其他:
在Windows下将tomcat生成服务,每次Windows就可自动重启Tomcat
可以弄成windows服务
1 cmd 进入 tomcat bin目录
2 执行 service install
完成
必须确保环境变量已配置正确

XP的步骤:
开始菜单–运行–services.msc–Apache Tomcat服务

 

 

命令行启动方法:
假设tomcat的路径:C:\tomcat
如果你的toamcat已经启动:在命令行中进入tomcat安装目录
C:\tomcat\bin>stutdown
之后 C:\tomcatbin>startup
这样tomcat完成了一次重启。

重启后,*次运行会比较慢,第二次运行就快了,*次的时候tomcat在做编译工作,第二次运行时已经编译好了

Centos7搭建FTP服务详细过程

一、安装VSFTP
1.为了方便后续操作,现将用户切换到root用户    su –

2.查看是否已经安装vsftpd

方法一:

[root@localhost ~]# rpm -q vsftpd

vsftpd-3.0.2-22.el7.x86_64

方法二:

[root@localhost ~]# vsftpd -v

yum安装vsftpd

[root@localhost ~]# yum -y install vsftpd
%title插图%num

3.安装完成后,查看位置

[root@localhost ~]# whereis vsftpd

vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

4.直接启动VSFTP服务

[root@localhost ~]# systemctl start vsftpd.service

[root@localhost ~]#

5.查看是否启动成功

[root@localhost ~]# netstat -npal|grep vsftpd

tcp6    0   0 :::21     :::*     LISTEN      4432/vsftpd

可以看到服务已经启动,端口为21,pid为4432

 

6.关闭SELinux限制,添加防火墙白名单

①设置关闭SELinux对ftp的限制

[root@localhost ~]# getsebool -a | grep ftp

ftp_home_dir –> on

ftpd_anon_write –> off

ftpd_connect_all_unreserved –> off

ftpd_connect_db –> off

ftpd_full_access –> on

ftpd_use_cifs –> off

ftpd_use_fusefs –> off

ftpd_use_nfs –> off

ftpd_use_passive_mode –> off

httpd_can_connect_ftp –> off

httpd_enable_ftp_server –> off

sftpd_anon_write –> off

sftpd_enable_homedirs –> off

sftpd_full_access –> off

sftpd_write_ssh_home –> off

tftp_anon_write –> off

tftp_home_dir –> off

 

[root@localhost ~]# setsebool -P ftpd_full_access on

 

②将ftp加入防火墙白名单

firewall-cmd –permanent –zone=public –add-service=ftp

firewall-cmd –reload

查看防火墙状态:firewall-cmd –list-all

二、配置修改
1.修改配置文件

[root@localhost ~]# cd /etc/vsftpd/

[root@localhost vsftpd]# vim vsftpd.conf

 

不允许匿名访问(不登录默认访问某目录/var/ftp)

anonymous_enable=NO

允许ascii文件上传和下载

ascii_upload_enable=YES

ascii_download_enable=YES

将用户限制在为其配置的主目录

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

三、匿名登录
匿名登陆
如果设置anonymous_enable=NO表示可以匿名登陆,保存后重新启动vsftp服务systemctl restart vsftpd.service),即可以匿名登陆ftp服务(ftp ipaddr),密码是空,对应目录是/var/ftp,如果你在配置里面配置了anonymous_enable=NO,匿名就无法登录。

 

四、多用户配置
1.首先需要在vsftp.conf添加如下配置

#设置启用虚拟用户功能

guest_enable=YES

#制定宿主用户名(我们后续需要为我们的系统增加该用户)

guest_username=ftpuser

#制定虚拟用户配置文件放置文件夹(需要我们自己建立)

user_config_dir=/etc/vsftpd/vuser_conf

#允许写

allow_writeable_chroot=YES

 

2.创建宿主用户

#创建宿主主文件夹

cd /home

mkdir vsftpd

# 创建用户 ftpuser 指定 `/home/vsftpd` 目录

# -s /sbin/nologin ftpuser 表示不允许该用户通过命令行方式登录

useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser

# 设置用户 ftpuser 的密码

passwd ftpuser

# 把 /home/vsftpd 的所有权给ftpuser.root

chown -R ftpuser.root /home/vsftpd

 

3.创建虚拟用户信息文件

vsftp目录下

cd /etc/vsftpd/

创建用户信息文件

touch vuser_passwd

vim vuser_passwd

#编辑如下内容,创建虚拟账户信息,奇数行为用户名,偶数行为密码

ftp-user1

123456

ftp-user2

123456

 

4.生成虚拟用户数据文件

db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db

chmod 600 /etc/vsftpd/vuser_passwd.db

在当前文件夹下生成一个vuser_passwd.db文件

 

5.编辑pam认证文件

vim /etc/pam.d/vsftpd

将其他都注释掉,添加下面两行;

注:db=/etc/vsftpd/vuser_passwd 中的vuser_passwd 是你生成的虚拟用户的db文件,这里不要加扩展名。

系统为32位:

auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd account

required pam_userdb.so db=/etc/vsftpd/vuser_passwd

 

系统为64位:

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd

account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd

 

查看系统位数

getconf LONG_BIT

 

6.为虚拟账户创建访问根目录,要在宿主用户下

# 下面是目录结构

/home/vsftpd

├──ftp-user1

│         └── files

└──ftp-user2

└──files

修改权限

chmod 777 ftp-user1

chmod 777 ftp-user2

 

7.创建虚拟用户配置目录

cd /etc/vsftpd/

#创建上述配置文件中配置的虚拟用户文件夹,一定要对应

mkdir vuser_conf

cd vuser_conf

#创建虚拟用户配置文件,文件名称要与虚拟用户名称相同

#这里我们配置两个虚拟用户就创建两个配置文件

touch ftp-user1 ftp-user2

#编辑两个文件,加入以下信息(注意加粗部分要替换为你虚拟账户要访问的根目录名称)

local_root=/home/vsftpd/ ftp-user1

write_enable=YES

anon_umask=022

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

 

8.创建chroot_list

cd /etc/vsftpd

#创建使当前配置的虚拟用户允许访问

[root@localhost vsftpd]# touch chroot_list

[root@localhost vsftpd]# vim chroot_list

#写入虚拟用户名

ftp-user1

ftp-user2

 

9.重启VSFTP服务

systemctl restart vsftpd.service

10.可以在windows中访问测试,或者使用FileZilla连接
%title插图%num

问题汇总:

1、解决报错 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

添加配置

allow_writeable_chroot=YES # 如果启用了限定用户在其主目录下需要添加这个配置。

2、登录报错530,日志显示

pam_unix(vsftpd:auth): check pass; user unknown

检查一下/etc/pam.d/vsftpd文件配置,一般是pam认证文件配置错误。

linux 安装及卸载vsftp

查看是否安装了vsftp:

rpm -qa |grep vsftp

卸载vsftp

rpm -e vsftp

安装vsftp

yum install -y vsftp

设置vsftp开机启动

chkconfig –list查看不同启动级别自动启动的系统服务

chkconfig –level 35 –add vsftpd on 添加vsftpd自启动以及级别为3和5(关闭为off,具体参照chkconfig)

更改vsftp端口

更改/etc/vsftpd/vsftpd.conf添加listen_port=更改的端口数值

更改/etc/services里的ftp对应的tcp和udp对应端口为更改的端口

centos7 搭建FTP服务器以及遇到的坑

1:安装vsftpd

yum install vsftpd -y

2:启动vsftpd

service vsftpd start

加入开机启动

chkconfig vsftpd on

启动后可以看到系统监听21端口

netstat -nltp | grep 21

3:vsftpd的文件说明

vsftpd.conf: 主要配置文件

ftpusers:配置禁止访问ftp服务器的用户列表

user_list:配置用户访问控制

4:配置阻止匿名用户访问和切换根目录

vi /etc/vsftpd/vsftp.conf

找到以下两处并按下面的样子修改

# 禁用匿名用户
anonymous_enable=NO
# 禁止切换根目录
chroot_local_user=YES

#开启以下配置

chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list     #如果没有此文件则创建此文件,不需要添加内容

文件末尾添加

allow_writeable_chroot=YES

不添加此项,连接ftp服务器的时候会报500 OOR。。。。

5:创建ftp用户

useradd ftpuser

为用户设置密码

echo “ftpuser123” | passwd ftpuser –stdin

6:限制上步创建的用户只能通过ftp访问

usermod -s /sbin/nologin ftpuser

7:为用户分配主目录

用以下命令创建,但是该目录不能上传文件

mkdir -p /home/ftp/pub

创建欢迎文件

echo “Welcome to use FTP service.” > /home/ftp/welcome.txt

设置访问权限

chmod a-w /home/ftp && chmod 777 -R /home/ftp/pub

设置为用户主目录

usermod -d /home/ftp ftpuser

8:保存后重启vsftpd

service vsftpd restart

9:配置防火墙

在防火墙的配置文件中开启21端口,并重启防火墙

上述步骤即可完成vsftpd搭建,但是客户端只能通过主动模式访问vsftpd,例如使用filezilla需要将传输模式的默认模式改为主动模式才能访问ftp服务器,如果发现可以正常登陆但是无法将目录列出来,就是这个原因.如果需要直接可以访问的话,需要将ftp服务器开启被动模式

1:修改配置文件

vi /etc/vsftpd/vsftpd.conf

2:在末尾添加

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

3:重启vsftpd并将上述的30000端口至31000端口开启,

-A INPUT -m state –state NEW -m tcp -p tcp –dport 30000:31000 -j ACCEPT

备注:过程虽然不难,但遇到的坑比较多,按照很多网上的文章进行配置,*后都是各种错误,刚开始是无法连接,发现没有给用户设置主目录,

当找到问题后修改,可以连接上但是发现权限不够(忘记给目录赋值权限),而且竟然发现创建的用户可以直接通过ssh连接到服务器,这样子就

失去了我想要的,安全性也大大降低了,总之问题很多,*头疼的还是提示已经登陆但是无法将目录展示出来,经过自己分析日志发现是模式不对,

希望大家可以借鉴参考,尽量少入点坑

阿里云Centos7.x负载均衡服务器间代码定时同步

环境:Centos7.X
负载均衡的代码主/从rsync定时同步

A服务器(主服务器):

安装rsync:yum install rsync -y
vi /etc/rsyncd.conf

strict modes = yes

port = 873

uid = root

gid = root

use chroot = no

max connection = 5

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/log/rsyncd.log

hosts allow = 172.18..X.X #内网B服务器

[www.XXX.com-rsync] #此段的名称,在B服务器同步时需指定

path = /home/wwwdata/www.XXX.com

ignore errors

read only = no

list = no

hosts allow = 172.18.X.X #内网B服务器

auth users = root

secrets file = /etc/rsyncd.password

设置同步时需要的账号密码

vi /etc/rsyncd.password
root:123456
chmod 600 /etc/rsyncd.password

Centos7.x防火墙默认不是iptables,是firewalld,因此要通过firewalld将rsync的873端口开放给B服务器

开放873端口:firewall-cmd –permanent –add-port=873/tcp
检查是否开启成功:firewall-cmd –permanent –query-port=873/tcp
重启防火墙:firewall-cmd –reload

启动:rsync –daemon –config=/etc/rsyncd.conf
开机启动:echo ‘/user/bin/rsync –daemon –config=/etc/rsyncd.conf’ >> /etc/rc.local
B服务器(从服务器)

设置同步密码(此处应与A服设置的访问密码一致)

vi /etc/rsyncd.password
123456
chmod 600 /etc/rsyncd.password

写同步脚本:vi rsync_xxx

#!/bin/bash
/usr/bin/rsync -avzP –delete –progress –password-file=/etc/rsyncd.password root@172.18.0.X.X::www.XXX.com-rsync home/wwwdata/www.XXX.com
chmod u+x rsync_xxx

定时同步:

定时同步:crontab -e
*/1 * * * * /home/wwwdata/rsync-from-106-www.XXX.com >> /home/wwwdata/_bk/crontab_www_`date+\%Y\%m\%d`.log 2>&1
重新加载:service crond reload
查看执行日志:tail -f /var/log/cron
查看自定义日志:cat /home/wwwdata/_bk/crontab_www_2016-12-24.log