当年腾讯云做校园优惠的时候入手了每月一块钱的服务器,在Apache上搭了WordPress用来写博客。然而由于疏于维护,网站经常遭到攻击,动不动就死机。最近干脆重装了系统,打算从头建立一个注重安全的服务器。
腾讯云服务器有个安全组管理,负责处理入站和出站的流量,其默认拒绝所有流量。为了能用SSH连接服务器,并且在服务器上安装软件,这里出站选择全部放通,入站则暂时开放TCP:22端口。(与安全组相关的内容可参考:腾讯云安全组学习笔记 - 云+社区 - 腾讯云。)
搭建FTP服务器
FTP服务器可以在服务器与客户端间进行文件传输。尽管该协议是明文传输,用户名与密码有被窃取的风险,但因为其搭建简单,使用方便,想了想还是搭了一个。我选择的是比较主流的软件vsftpd,主要的任务就是修改/etc/vsftpd/vsftpd.conf这个文件,具体可参考鳥哥的 Linux 私房菜 -- 檔案伺服器之三: FTP 伺服器。
大概干了以下的事情:开放一个实体user给自己管理,享有ftp文件夹的全部权限;开放anonymous供下载;开启被动模式。
Allow anonymous FTP? (Beware - allowed by default if you comment this out).anonymous_enable=YESUncomment this to allow local users to log in.When SELinux is enforcing check for SE bool ftp_home_dirlocal_enable=YESUncomment this to enable any form of FTP write command.write_enable=YESbelow is some useful settingspasv_enable=YESpasv_max_port=65410pasv_min_port=65400
然后安全组选择开放TCP:20,21,65400-65410入站,ftp就搭建完成了!输入命令systemctl restart vsftpd 启动!
搭建http服务器
搭建http服务器应该就是我们通常所说的建站,主流的服务器软件有两个:Apache和Nginx。我这里选择的是最近比较流行的Nginx+Lua构架的OpenResty。
这里我们根据官网安装OpenResty,并参考教程《OpenResty 最佳实践》使用OpenResty写一个hello world程序。
首先创建一个带家目录的系统帐号:
useradd www -m -r
网站的主要文件将存放于/home/www目录下,该账号不能登录Bash,也没有管理员权限,这样即使网站被攻破了也不影响服务器的其它服务。
下面我们编写~/openresty-test/conf/nginx.conf文件,提供静态文件服务:
worker_processes1;nginx worker 数量error_loglogs/error.log;指定错误日志文件路径events{worker_connections1024;}http{server{监听端口,若你的80端口已经被占用,则需要修改listen80;processes requests ending with the slash characterusing an index file causes an internal redirecta / request will actually be processedin the second location as /index.html.location=/{rootstatic;indexindex.html;}location~\.(html|txt|ico)${content_by_lua_block{localfile,err=io.open(ngx.config.prefix().."static"..ngx.var.uri,"r")ifnotfilethenngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)endngx.print(file:read("*a"))file:close()}}location/{content_by_lua_block{ngx.exit(ngx.HTTP_BAD_REQUEST)}}}}
事实上,本身Nginx就提供了很好的静态文件的处理功能。但我们这里用content_by_lua_block模块代替Nginx输出响应体则可以做到更加灵活地处理请求。例如当找不到目标文件时,Nginx默认会返回404并在日志中记录该错误,我们在这里则可以有更多的处理。
在启动Nginx前,我们需要添加环境变量:
exportPATH=/usr/local/openresty/bin:/usr/local/openresty/nginx/sbin:$PATH
以及允许普通用户启动Nginx时使用1024以下的端口:
setcap cap_net_bind_service+eip /usr/local/openresty/nginx/sbin/nginx
重启之后就可以启动Nginx服务了:
nginx -p ~/openresty-test
如果修改了配置文件,可以执行重装载命令使用新的配置:
nginx -p ~/openresty-test -s reload
使用ps命令可以查看Nginx进程:
ps -ef|grep nginx
使用kill结束Nginx进程:
kill-QUIT$(cat ~/openresty-test/logs/nginx.pid)
OpenResty的特点
最后我摘取《OpenResty 最佳实践》的部分内容,帮助大家更好地理解OpenResty 是干什么的。OpenResty其实最早是Nginx的一个Lua模块,它能使我们通过Lua语言更方便地配置Nginx。
OpenResty 处理一个请求的流程可以参考下图:
它主要包含了以下阶段:
- set_by_lua*:流程分支处理判断变量初始化
- rewrite_by_lua*:转发、重定向、缓存等功能(例如特定请求代理到外网)
- access_by_lua*:IP 准入、接口权限等情况集中处理(例如配合 iptable 完成简单防火墙)
- content_by_lua*:内容生成
- header_filter_by_lua*:响应头部过滤处理(例如添加头部信息)
- body_filter_by_lua*:响应体过滤处理(例如完成应答内容统一成大写)
- log_by_lua*:会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
这几个阶段的存在,应该是 OpenResty 不同于其他多数 Web 平台编程的最明显特征了。由于 Nginx 把一个请求分成了很多阶段,这样第三方模块就可以根据自己行为,挂载到不同阶段进行处理达到目的。OpenResty 也应用了同样的特性。所不同的是,OpenResty 挂载的是我们编写的 Lua 代码。这样我们就可以根据我们的需要,在不同的阶段直接完成大部分典型处理了。
在这篇文章的配置中,我们只使用其中一个阶段 content_by_lua*。理论上靠这个阶段也可以完成所有的处理。但这样做,会让我们的代码比较臃肿,越到后期越发难以维护。把我们的逻辑放在不同阶段,分工明确,代码独立,后期发力可以有很多有意思的玩法。
在下一篇文章中,我们将介绍如何使用OpenResty的模块操作数据库以及如何开启websocket协议实现聊天室功能。
0 留言