搭建 web 运行的基础环境 0x01 主机环境 0x02 LNMP 0x03 数据库测试 0x04 加固 附录一:Nginx配置文件分析 附录二:php-cgi和php-fpm有什么关系? 附录三:TCP Socket 模式配置 附录四:LAMP Reference
- VMware® Workstation 16 Pro
- Windows 10 20H1
- Ubuntu 18.04.4 LTS
0x02 LNMP
-
Nginx
安装 sudo apt-get update sudo apt-get install nginx -y 启动 sudo service nginx start
-
MySQL
安装 sudo apt-get install mysql-server mysql-client
在安装完成后,执行下面命令:
mysql -u root -p
然后要求输入密码,但是没设置过,这个就是MySQL自身会设置的随机密码的问题了,解决方法就是重新设置新的 root 密码,解决方法如下:
sudo mysql mysql> use mysql; mysql> update mysql.user set authentication_string=PASSWORD('新密码'), plugin='mysql_native_password' where user='root'; mysql> flush privileges;
成功配置 root 密码。
-
PHP
与Apache不同,Nginx不包含本地PHP处理。为此,我们必须安装PHP-FPM(FastCGI Process Manager)。FPM是另一种PHP FastCGI实现,具有一些对重载站点有用的附加功能。另外还需要安装php-mysql以允许PHP与MySQL数据库通信。
sudo apt-get install php7.2-fpm php7.2-mysql -y
-
配置Nginx
cd /etc/nginx/sites-available/ sudo cp default default.bak sudo vim default
配置:
修改配置文件如附录一。
以下命令可以测试新配置文件的语法错误:
sudo nginx -t
准备好后,重新加载Nginx的配置文件:
sudo systemctl reload nginx
成功:
0x03 数据库测试
<?php
$host = "localhost";
$username = "root";
$password = "19971231";
$dbname = "xazl";
$conn = new mysqli($host, $username, $password, $dbname);
if($conn->connect_error){
die("连接失败: " . $conn->connect_error);
}
$sql = "select * from xazl_test";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo ";
}
}
?>
执行结果:
0x04 加固
1. 安全狗
安装过程:
wget http://down.safedog.cn/safedog_linux64.tar.gz
tar xzvf safedog_linux64.tar.gz
cd safedog_an_linux64_2.8.21207
chmod +x *.py
sudo apt-get install ifupdown
sudo ./install.py
安装截图:
绑定账号:
面板:
2. Nginx 默认配置
使用 Nginx 中配置信息,增强安全性:
http{
server_tokens off; # 隐藏 Nginx 版本号
autoindex off; # 关闭目录访问
limit_conn addr 100; # 给定的key设置最大连接数,这里key是addr
limit_rate 100k; # 对每个连接限速100k
# 控制缓冲区大小
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
# 清除不安全的HTTP响应头
more_clear_headers "X-Powered-By";
more_clear_headers "Server";
more_clear_headers "ETag";
more_clear_headers "Connection";
more_clear_headers "Date";
more_clear_headers "Accept-Ranges";
more_clear_headers "Last-Modified";
# 禁止不安全的 HTTP 方法
if($request_method !~ ^(GET|HEAD|POST)$){
retrun 444;
}
}
3. UFW
ufw是一个主机端的iptables类防火墙配置工具,比较容易上手。一般桌面应用使用ufw已经可以满足要求了。
安装方法: sudo apt-get install ufw
检查 UFW 状态:
sudo ufw status verbose
[OUTPUT]
Status: inactive
应用配置:
大部分应用都附带一份应用配置,它描述了服务,并且包含了 UFW 设置。
sudo ufw app list
[OUTPUT]
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
查看应用配置信息:
启用 UFW:
现在 UFW 防火墙被配置允许 SSH 远程连接,启用它,输入:
sudo ufw allow ssh
输出:
Rules updated
Rules updated (v6)
例如,如果你的 SSH 守护程序监听了7722
,输入下面的命令,允许连接通过那个端口:
sudo ufw allow 7722/tcp
现在防火墙被配置允许进来的 SSH 连接,你可以输入下面的命令,启用它:
sudo ufw enable
图片:
删除 UFW 规则:
想要通过规则序号来删除,你需要找到你想删除的规则序号。想要这么做,运行下面的命令:
sudo ufw status numbered
输出:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 8080/tcp ALLOW IN Anywhere
想要删除规则,序号为3,这个规则允许对端口8080的连接,你可以使用下面的命令:
sudo ufw delete 3
想要重置 UFW,简单输入下面的命令:
sudo ufw reset
附录一:Nginx配置文件分析
配置文件位置
Nginx的配置文件默认位置为:/etc/nginx/nginx.conf
使用vim打开文件nginx.conf
vim /etc/nginx/nginx.conf
配置文件分析
# 全局块:配置影响 nginx 全局的命令
user www-data; # 运行 nginx 的用户组
worker_processes auto; # nginx 启动进程,通常设置成和cpu的数量相等,这里为自动
pid /run/nginx.pid; # pid文件地址,记录了nginx的pid,方便进程管理
include /etc/nginx/modules-enabled/*.conf; # 用来加载其他动态模块的配置
# events块:配置影响 nginx 服务器或与用户的网络连接
# 每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,
# 是否允许同时接受多个网络连接,开启多个网络连接序列化等。
events {
# 每个worker_processes的最大并发链接数
# 并发总数:worker_processes*worker_connections
worker_connections 768; # 最大连接数
accept_mutex on; # 设置网络连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
}
# http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
http {
sendfile on; # 设置nginx是否使用sendfile函数输出文件
# 如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,
# 以平衡磁盘与网络 I/O 处理速度,降低系统的负载。
sendfile on;
tcp_nopush on; # 告诉 Nginx 在一个数据包里发送所有头文件,而不一个接一个的发送
tcp_nodelay on; # 告诉 Nginx 不要缓存数据,而是一段一段的发送
# 当需要及时发送数据时,就应该给应用设置这个属性
keepalive_timeout 65; # 连接超时时间,默认为75s
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types; # 引入文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
# SSL 配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
# 日志路径
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 引入其他位置配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
server 配置
server {
# default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html; # 请求寻找资源的根目录
index index.php index.html index.htm index.nginx-debian.html; # 网站默认首页
server_name _; # 配置虚拟主机的名称,支持正则表达式
# location
# 基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),
# 对除虚拟主机名称之外的字符串(前例中“/uri-string”部分)进行匹配,对特定
# 的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。
location / {
# 按顺序检查$uri文件,$uri地址是否存在,如果存在,返回第一个找到的文件;
# 否则 404
try_files $uri $uri/ =404;
}
# 所有 php 的页面均交由php解释器处理
# ~ 用于表示uri包含正则表达式,并且区分大小写
location ~ .php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
fastcgi_pass 127.0.0.1:9000;
}
}
附录二:php-cgi和php-fpm有什么关系?
作者:Willis
链接:https://www.zhihu.com/question/55835080/answer/749298981
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我在这里简单的说一下php-cgi与php-fpm的关系:
1、Linux下安装好php,会有“php”和“php-cgi”这两个可执行程序(在win下是php.exe和php-cgi.exe),这两个程序其实基本上是一样的,都是“php解释器”(就是php的核心),就是能把你写的php代码进行解释最后输出代码的结果。2、既然php与php-cgi的功能都是“php解释器”,那它们的不同点在哪?不同点就在于提供的接口不同,php属于cli接口(client客户端接口),只能用命令去调用,而php-cgi则提供了fastCGI接口,fastCGI接口是一种“网络接口”,你可以通过网络的方式去调用它,比如nginx调用php-cgi可以用“fastcgi_pass 127.0.0.1:9000;”这样调用,其中的“127.0.0.1”你完全可以换成非本机ip,比如你在B服务器(ip为23.45.67.78)的9000上运行了一个php-fpm,那么你A服务器的nginx可以用“fastcgi_pass 23.45.67.78:9000;”这样去调用B服务器的php-fpm。
3、解释了php与php-cgi的区别,再来说php-cgi与php-fpm的区别。简单来说,就是php-cgi有很多缺点(具体是什么很多人回答,我就不说了),有些大牛觉得完全可以改进它,于是就有人写出了php-fpm,最初php-fpm是需要调用php-cgi来解释php代码的,php-fpm只起到进程管理的作用,但是因为php-fpm这个民间第三方写的工具实在比php-cgi好太多了,php官方在php5.4时就把它集成到了php官方发布的包中,并且php-fpm不需要再依赖php-cgi,直接把php解释器的功能集成进php-fpm了。
4、所以现在的php-fpm跟php和php-cgi都能解释php代码,只不过,php(强调一下这是可执行文件,在win下叫php.exe)是cli模式调用,即用命令调用,而php-cgi和php-fpm可以通过“网络”来调用,而所使用的网络协议叫“fastCGI协议”,只不过php-fpm比php-cgi高级很多。(注意,有人说php-cgi不支持fastCGI协议,我这里必须再次强调,这个说法是错的,具体请看我这篇文章https://www.xiebruce.top/606.html中的两个实例证明)。
需要强调一下:win不支持php-fpm,因为php-fpm是使用Linux的fork()来做的,所以win下面基本上还是使用php-cgi,当然有人用“Cygwin”这个软件可以在win下模拟Linux的fork(),但如果你是本地开发环境就没必要这么做了,用win10做开发的我建议你们考虑一下wsl。
总结:php-fpm就是php-cgi的升级版(并非简单的在php-cgi的基础上升级,而且通过直接采用第三方代码的方式,实质上是用php-fpm“替换”了php-cgi,而不是简单的升级,但我们可以理解为升级),总之,现在在linux服务器上用php-fpm即可,当然也有人用apache,用apache的话,php可以作为apache的模块,当然也可以用php-fpm的方式,因为apache有支持fastCGI的模块,让它可以像nginx一样,把用户请求的php文件转交给php-fpm处理。
附录三:TCP Socket 模式配置
修改/etc/nginx/sites-available/default
:
修改php-fpm
配置:
重启php-fpm
、nginx
:
sudo service php7.2-fpm restart
sudo service nginx restart
附录四:LAMP
安装 Apache2
sudo apt-get install apache2 -y
关闭 Nginx:
关闭nginx:
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
启动 Apache2:
检验 Apache 是否可以调用 PHP 命令:cat /etc/apache2/mods-enabled/php.load
成功运行: