Loading

搭建 web 运行的基础环境

0x01 主机环境

  • VMware® Workstation 16 Pro
  • Windows 10 20H1
  • Ubuntu 18.04.4 LTS

0x02 LNMP

  1. Nginx

    安装
    sudo apt-get update
    sudo apt-get install nginx -y
    启动
    sudo service nginx start
    
  2. 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 密码。

  3. 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
    
  4. 配置Nginx

    cd /etc/nginx/sites-available/
    sudo cp default default.bak
    sudo vim default
    

    配置:

    LNMP1

    修改配置文件如附录一。

    以下命令可以测试新配置文件的语法错误:

    sudo nginx -t
    

    准备好后,重新加载Nginx的配置文件:

    sudo systemctl reload nginx
    

    成功:

    lnmp2

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 "id=".$row['id']."\t"."name=".$row['name']."<br>";
    }
}
?>

执行结果:

lnmp5

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

安装截图:

safedog1

绑定账号:

safedog2

面板:

safedog3

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:

现在 UFW 防火墙被配置允许 SSH 远程连接,启用它,输入:

sudo ufw allow ssh

输出:

Rules updated
Rules updated (v6)

例如,如果你的 SSH 守护程序监听了7722,输入下面的命令,允许连接通过那个端口:

sudo ufw allow 7722/tcp

现在防火墙被配置允许进来的 SSH 连接,你可以输入下面的命令,启用它:

sudo ufw enable

图片:

UFW2

删除 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

LNMP4

修改php-fpm配置:

LNMP3

重启php-fpmnginx

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

LAMP

成功运行:

LAMP2

Reference

Nginx服务器安全加固tips整理

如何在 Ubuntu 20.04 上使用 UFW 来设置防火墙

Nginx配置文件详解(详细)

使用php-fpm还是php-cgi

在Ubuntu18.04安装LNMP

如何在 Ubuntu 20.04 上使用 UFW 来设置防火墙

posted @ 2021-01-21 23:24  chalan630  阅读(460)  评论(0编辑  收藏  举报