LNMP搭建教程

花也
2023-12-15 / 0 评论 / 21 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年12月15日,已超过146天没有更新,若内容或图片失效,请留言反馈。

这是一篇LNMP搭建教程。

LNMP是Linux + Nginx + MySQL + PHP的简称。LNMP可以干嘛呢,我们大部分时候看到的各种网站基本都是在这个架构上搭建起来的,基本是想搭建自己的网站服务的第一步了。当然现在还有一些简单的静态页面架构,这个后续有时间再说(其实是我现在也不怎么用静态页面,还不会?)。

这篇教程只讨论应用有关的部分,不讨论底层知识。

背景:需要搭建博客 + 网盘 + 图床。

  • 博客要求是轻量,有数据库每天备份,最终选择typecho;
  • 网盘更多的是用对象存储或者一些厂商的云盘服务,最终选择了alist(墙推);
  • 图床最终选择是lsky pro,虽然开源版不再更新了,但是依旧很好用。

要求:

  • typecho和lsky pro都要求LNMP环境,alist只需要nginx做反代;
  • 服务器性能要求至少为2C2G40G;
  • 数据库每天自动备份,本地 + 云端各一份;
  • 每月的服务器+流量+存储费用在合理范围内。
  • 不折腾,稳定,可以长期用。

成本:

  • 服务器成本:2C2G40G流量1T每年的费用从20刀到80刀不等(按2023年12月份美元对人民币汇率7.3来算,大概146R~584R一年),取决于服务器的性能、网络、稳定性、地理位置等等吧,总体差距还是很大的;
  • 存储费用:刚提到要用对象存储,单独使用服务器的40G是远远不够的,而且数据和服务分开可以大大提升数据安全性。国外对象存储价格大多在每TB月付5刀~15刀,支持按量付费,国内一般都是按照资源包的方式购买的。对象存储服务最贵的是CDN流量费用,国外可以考虑白嫖CloudFlare带宽联盟,但是国内访问速度不理想。国内只能靠买资源包,但还划算。另外需要注意:使用国内的CDN服务必须有备案域名,其次国内CDN和国外CDN不通用,国外CDN必须另外购买资源包;
  • SSL证书靠白嫖;
  • 时间成本和人力成本。其实服务搭建好后,别时不时想着去动一下,很稳定的。数据和数据库做好备份,基本不需要什么维护。

接下来开始搭建(建议先把下面内容看一遍再回来跟着搭建):

Linux部分

Linux部分主要分为以下几个方面:

  1. 重装服务器
  2. 创建用户及设置密码
  3. 设置SSH端口及禁止root用户登录
  4. 安装系统必要软件和推荐软件
  5. 开启防火墙和放行端口

1. 重装服务器

为什么要先从服务器重装开始呢?

因为我们购买服务器的时候,大部分的服务器镜像或者系统都是厂商定制过的,里面多多少少塞了一些厂商的东西,比如对服务器的监控服务等。

为了避免监控或者保证服务器的干净,我们先对系统重装一下。如果你一开始就是使用镜像自己安装的,可以跳过这一部分。

如果服务器厂商后台可以挂载系统镜像,那手动挂载镜像然后重装是最推荐的办法。

如果后台不可以挂载镜像,那就看接下来的重装教程吧。

使用厂商给的用户名和密码使用SSH登录服务器。
然后在root用户下逐行输入以下几条命令:

apt update
apt install wget xz-utils openssl gawk file -y
wget --no-check-certificate -qO InstallNET.sh 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh'
chmod a+x ./InstallNET.sh
bash ./InstallNET.sh -d 12 -v 64 -a

如果是国内的服务器,执行最后一条命令后,下载镜像速度很慢。因为这条命令默认使用Debian官方服务器,国内基本没法用。所以可以在最后一条命令后面追加

--mirror 'http://mirrors.ustc.edu.cn/debian/'

以使用中科大的源。追加后的命令如下:

bash ./InstallNET.sh -d 12 -v 64 -a --mirror 'http://mirrors.ustc.edu.cn/debian/'

等待系统下载完毕,服务器自动重启。如果不出什么幺蛾子的话,等待大概五到十五分钟,服务器安装完毕。安装速度取决于服务器性能和网络。

服务器重装完毕后使用root账户和MoeClub.org密码登录服务器。

在执行下面操作之前,我们可能会遇到Debian的一个很经典的

bash xxx : command not found

的错误提示。

解决方法,依次输入以下两条命令:

echo "PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"" >> /etc/profile
source /etc/profile

2. 创建用户及设置密码

  • 修改root用户密码

root密码是一定需要修改的,MoeClub.org是上面的重装脚本自动设置的,凡是使用该重装脚本重装的系统,root密码都是MoeClub.org,所以一定要改成自己的密码。

passed root

命令提示符会提示输入密码。输入密码后回车。

命令提示符会提示再次输入密码。输入密码后回车。

提示password update successfully.说明密码设置成功。

  • 创建用户

    useradd -m username

    以上命令会创建一个用户名为"username"的用户,并在/home/文件夹下创建username文件夹。

请将username改成你自己想要设定的用户名,下文遇到username同样改成你自己想要设定的用户名。

注: -m参数是指定创建用户同时创建该用户的目录

  • 设置用户密码

    passwd username

    命令提示符会提示输入密码。输入你想要为username用户设定的密码。回车。

命令提示符会提示再次输入密码。再次输入一遍你想要为username用户设定的密码后回车。

为了安全,输入密码的时候是看不到密码的。两次输入密码也保证了输入的密码极大概率不会出错。

提示password update successfully.说明密码设置成功。

3. 设置SSH端口及禁止root用户登录

  • 设置SSH端口

使用任一编辑器(个人推荐nano编辑器),编辑/etc/ssh/sshd_config文件:

nano /etc/ssh/sshd_config

找到Port 22所在的行。如果你想将ssh登录端口改为2023,那么就将Port 22修改为Port 2023

SSH是支持多端口登录的,在设置端口为2023的同时,还可以同时设定为2024、2025、8888、等任一Linux端口,只需要添加一行Port 8888就行了。

后续就可以使用端口2023或者8888来登录。

注意不要和其他服务的端口重复。

  • 禁止root用户登录

root用户是Linux系统最关键的用户,日常请不要使用该用户进行操作,同时禁止该用户远程登录以防止他人对服务器进行登录攻击。(这个一定要重视,我之前买过一个服务器,平均每周能有几十次登录失败的提示,都不是我个人的登录操作,换端口+禁止root账户登录可以有效防止此类情况发生)

上述重装系统后,会默认开放root用户登录(大多数厂商都是此类方式),因为没有其他用于登录的账户了。

但是我们上面已经创建了一个账户,所以此处就可以禁止root远程登录了(但是实机或者厂商提供的VNC方式依旧可以正常登录,这两种方式不属于远程)。

依旧是上面的sshd_config文件,找到Prohibit root Login的那一行,把最后的yes改为no。

然后保存退出该文件,重启一下sshd服务:

systemctl restart sshd

后续就可以使用我们刚才创建的账户和端口登录服务器了。

注意一定要先创建普通用户再禁止root账户登录。

4. 安装必要软件和推荐软件

如果是国内服务器,在安装软件前,先更换一下软件源为国内的软件源。

nano /etc/sources.list

然后将文件中的deb.debian.orgsecurity.debian.org修改为mirrors.ustc.edu.cn,再执行以下命令。

国外服务器请忽略以上软件源配置。

apt update
apt dist-upgrade -y

apt install sudo net-tools wget unzip tree curl gcc g++ build-essential autoconf libnuma1 libaio1 libmecab2 psmisc iputils-ping procps mecab-ipadic-utf8 libssl-dev git nodejs python3 python3-pip rclone screen iftop lsof aria2 -y

ln -s /usr/bin/python3 /usr/bin/python

以上命令更新整个系统至最新,并安装了一些推荐软件包(net-tools,wget,curl,unzip,tree,git,nodejs,python3,python3-pip,rclone,screen,iftop,lsof,aria2。这些软件如果不需要可以按需删除),同时设置python3为系统默认的python环境。

5. 开启防火墙和放行端口

Debian12默认防火墙是nftables,很强大,但是官方文档看的我不是很能理解(●'◡'●)。

废话不多说,开干。

首先开启站内IPv4流量转发:

sed -i "28a net.ipv4.ip_forward=1" /etc/sysctl.conf

执行以下几条命令以设定nftables开机自启,同时编辑防火墙规则:

systemctl enable nftables
nft flush ruleset
mv /etc/nftables.conf /etc/nftables.conf.bak
nano /etc/nftables.conf

将以下内容复制粘贴进去:

table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                iif "lo" accept
                ct state established,related accept
                ip protocol icmp icmp type echo-request ct state new accept
                ct state invalid drop
                tcp dport 80 accept
                tcp dport 443 accept
                tcp dport 2023 accept
                tcp dport 8888 accept
                udp dport 6666 accept
                tcp dport 6666 accept
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}

保存并关闭文件,然后输入以下命令重启nftables服务:

systemctl restart nftables

此时nftables防火墙就生效了。

简单解释一下以上内容:

  1. 设置了防火墙规则为:进站数据丢弃,出站数据全部接收,站内转发数据全部接收。因为攻击都是从外部来的,所以不可以让乱七八糟的流量都进服务器,所以进站默认是丢弃的(但是开放了一些必要端口);出站就是服务器的数据向外输出,正常的服务器流量都要出站才可以传达给用户;站内转发就是服务器内部各个网卡间的通信,需要开启。
  2. 进站规则中:本地回环流量(lo网卡)设置为接收;已经连接的通信数据设置为接收;icmp请求(就是服务器的ping)设置为接收;不合法的通信数据丢弃。
  3. 开放了http 80端口,https 443端口,上面我们设置的SSH 2023和8888端口,这些都是走的tcp流量,所以只开启了这些端口的tcp流量接收。

     tcp dport 80 accept
     tcp dport 443 accept
     tcp dport 2023 accept
     tcp dport 8888 accept
  4. 开启了6666的tcp和udp的流量接收,我们此处没有用到,这里只是提供一个示例如何打开端口对应的UDP流量。

     udp dport 6666 accept
     tcp dport 6666 accept

    注意端口不要照抄我的,自己需要用哪些端口就开放哪些,不需要的都建议关掉。

至此,Linux部分就设置完了。

Nginx部分

首先需要创建一个用户www及对应的用户组(www就是我们服务器里提供服务的用户,nginx服务和PHP服务都将属于www)。

然后在根目录创建一个文件夹www

当然也可以在其他地方创建不同名字的文件夹,但下方的教程里遇到的时候请注意同步更改命令内容,建议初学还是跟着本教程来,本教程也是按照LNMP.org的一键安装脚本安装后自己摸索出来的。

groupadd www
useradd -g www www
mkdir /www

然后开始安装nginx:

apt install nginx -y
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

配置nginx:

nano /etc/nginx/nginx.conf

然后把以下内容复制粘贴进去:

user www www;
worker_processes auto;

error_log /var/log/nginx/error.log crit;
pid /run/nginx.pid;
worker_rlimit_nofile 51200;

events {
  use epoll;
  worker_connections 51200;
  multi_accept on;
}

http {
  include mime.types;
  default_type application/octet-stream;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 4096m;
  client_body_buffer_size 100m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 120;
  server_tokens off;
  tcp_nodelay on;

  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  fastcgi_intercept_errors on;

 #Gzip Compression
  gzip on;
  gzip_buffers 16 8k;
  gzip_comp_level 6;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_vary on;
  gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  ##Brotli Compression
  #brotli on;
  #brotli_comp_level 6;
  #brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

  ##If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
  #open_file_cache max=1000 inactive=20s;
  #open_file_cache_valid 30s;
  #open_file_cache_min_uses 2;
  #open_file_cache_errors on;
######################## default ############################
  server {
    listen 80;
    server_name _;
    access_log /var/log/nginx/access.log combined;
    root /www/;
    index index.html index.htm index.php;
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    location /nginx_status {
      stub_status on;
      access_log off;
      allow 127.0.0.1;
      deny all;
    }
    location ~ [^/]\.php(/|$) {
      #fastcgi_pass remote_php_ip:9000;
      fastcgi_pass unix:/dev/shm/php-cgi.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
      expires 30d;
      access_log off;
    }
    location ~ .*\.(js|css)?$ {
      expires 7d;
      access_log off;
    }
    location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
      deny all;
    }
  }
########################## vhost #############################
  include /etc/nginx/vhost/*.conf;
}

保存退出该文件。
然后创建两个文件夹:

mkdir /etc/nginx/vhost
mkdir /etc/nginx/ssl

vhost用来放置网站的配置文件,ssl用来放置网站的证书。

至此,Nginx部分就设置完了。

另注:

  • 如果你用的是Debian11,那么使用systemctl status nginx的时候,可能会发现提示无法加载nginx.pid,执行以下几条命令就好了:

    mkdir -p /etc/systemd/system/nginx.service.d
    printf "[Service]\nExecStartPost=/bin/sleep 0.1\n" >/etc/systemd/system/nginx.service.d/override.conf
    systemctl daemon-reload
    systemctl restart nginx

    MySQL部分

    需要去MySQL官网下载安装包,或者直接用MariaDB,本文使用MySQL官网安装包的方式安装。

MySQL社区版适用于Debian12安装包的官网下载地址:https://cdn.mysql.com//Downloads/MySQL-8.2/mysql-server_8.2.0-1debian12_amd64.deb-bundle.tar

或者直接:

wget https://cdn.mysql.com//Downloads/MySQL-8.2/mysql-server_8.2.0-1debian12_amd64.deb-bundle.tar

下载到本地后解压:

tar xvf ./mysql-server_8.2.0-1debian12_amd64.deb-bundle.tar

逐行使用以下命令进行安装组件:

dpkg -i mysql-common_8.2.0-1debian12_amd64.deb
dpkg -i mysql-community-client-plugins_8.2.0-1debian12_amd64.deb
dpkg -i mysql-community-client-core_8.2.0-1debian12_amd64.deb
dpkg -i mysql-community-client_8.2.0-1debian12_amd64.deb
dpkg -i mysql-client_8.2.0-1debian12_amd64.deb
dpkg -i mysql-community-server-core_8.2.0-1debian12_amd64.deb
dpkg -i mysql-community-server_8.2.0-1debian12_amd64.deb
dpkg -i mysql-server_8.2.0-1debian12_amd64.deb

在安装mysql-community-server_8.2.0-1debian12_amd64.deb的时候,会提示输入MySQL的root账户密码,输入两次(这里是让设定MySQL的root密码,和Linux系统的root账户不是同一个账户)。然后会让选择密码强度,选择Strong,强密码。

以上命令执行完之后,输入以下命令进行一些初始化设置:

mysql_secure_installation

输入MySQL root账户密码开始设定。

  • 是否安装密码增强插件:是
  • 密码等级:2
  • 是否需要修改root账户密码:直接回车或输入n
  • 是否关闭root远程登陆:y
  • 是否移除匿名用户:y
  • 是否现在刷新权限:y

至此,MySQL部分设定结束。

注:

然后安装:

dpkg -i libssl1.1_1.1.1w-0+deb11u1_amd64.deb

然后重新执行MySQL的安装过程。

PHP部分

Debian12默认的PHP版本是PHP8.2,但是lsky pro用8.2版本的PHP会出错,所以我们使用PHP8.0版本。

输入以下命令追加PHP源:

apt install -y lsb-release apt-transport-https ca-certificates wget
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
apt update

然后开始安装PHP:

apt install php8.0-fpm php8.0-bcmath php8.0-curl php8.0-xml php8.0-mbstring php8.0-mysql php8.0-pgsql php8.0-redis php8.0-soap php8.0-xmlrpc php8.0-zip php8.0-gd php8.0-imagick php8.0-bz2 -y

接下来配置PHP。
首先是PHP.ini,这是PHP的配置文件,很长很长,所以建议直接用wget下载,执行以下命令:

cd /etc/php/8.0/fpm
cp /etc/php/8.0/fpm/php.ini /etc/php/8.0/fpm/php.ini.bak
wget --no-check-certificate https://icdn.wexue.com/Server/php.ini -O /etc/php/8.0/fpm/php.ini

其次配置php-fpm.conf,这是php-fpm的配置文件,执行以下命令:

mv /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
nano /etc/php/8.0/fpm/php-fpm.conf

然后把以下内容复制粘贴进去:

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
pid = /run/php/php8.0-fpm.pid
error_log = /var/log/php8.0-fpm.log
log_level = warning

emergency_restart_threshold = 30
emergency_restart_interval = 60s
process_control_timeout = 5s
daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

include=/etc/php/8.0/fpm/pool.d/*.conf

保存退出。

最后配置www.conf,这是对php-fpm.conf文件的补充覆盖,可以简单理解为PHP网站的配置文件:

cd /etc/php/8.0/fpm/pool.d/
mv /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.bak
nano /etc/php/8.0/fpm/pool.d/www.conf

复制粘贴以下内容:

[www]
listen = /run/php/php8.0-fpm.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www

pm = dynamic
pm.max_children = 16
pm.start_servers = 10
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.max_requests = 2048
pm.process_idle_timeout = 10s
request_terminate_timeout = 120
request_slowlog_timeout = 0

;pm.status_path = /status
;slowlog =  log/$pool.log.slow
rlimit_files = 51200
rlimit_core = 0

catch_workers_output = yes
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

保存退出。

至此,PHP部分配置完毕。

结果检查:
输入以下命令重启PHP、MySQL和Nginx:

systemctl restart php8.0-fpm
systemctl restart mysql
systemctl restart nginx

然后使用以下命令查看PHP、MySQL和Nginx服务状态:

systemctl status php8.0-fpm
systemctl status mysql
systemctl status nginx

如果三个服务都是active(running)状态并且无Error提示就说明配置完成了。

提示:

  • 如果使用systemctl status xxx的时候不显示命令提示符,输入q就可以了。

重启一下服务器。

0

评论 (0)

取消