zoukankan      html  css  js  c++  java
  • 搭建 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']."	"."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 来设置防火墙

  • 相关阅读:
    实例变量和类变量
    Spring源码解读(一)
    linux shell学习三
    linux shell学习二
    linux shell学习一
    利用Zynq Soc创建一个嵌入式工程
    (转) 使用vivado创建工程 4[完结]
    (转) 使用vivado创建工程 3
    (转) 使用vivado创建工程 2
    (转) 使用vivado创建工程 1
  • 原文地址:https://www.cnblogs.com/chalan630/p/14342570.html
Copyright © 2011-2022 走看看