在 Debian 上安装 LNMP(NGINX + MariaDB + PHP)

更新日期:2023-06-16

曾经我是 Apache 的忠实拥趸,但后来我经常发现 Apache 的内存占用极其恐怖,一个进程可以占用几百M的内存,无论我怎么调整 Apache 配置都没有效果,我估计应该是某种原因导致其内存溢出了,而我找不到原因,即使修改 MaxConnectionsPerChild 参数也没有用。于是我就转投 NGINX 的怀抱了,自从用了 NGINX 之后,在 Debian 系统上使用 LNMP 搭建的 WordPress 博客只占用了300M左右的内存,再也没遇见过内存溢出的情况,腰也不疼了,气也不喘了,感觉倍儿有精神。Goodbye Apache!

注意事项:请使用纯净系统安装,该教程适用于 Debian 10与更新版本,默认使用root权限,#后面的文字为注释,切勿复制

在这篇教程中我将编译安装 NGINX ,编译安装的优点是能够安装最新版本的 NGINX 和 openssl、ngx_brotli 等组件、自定义性强,缺点则是过程较为繁琐,更新版本也较为复杂。

1、编译安装 NGINX + openssl + ngx_brotli

(1)首先安装编译 NGINX 的必要组件:

apt update && apt full-upgrade -y

apt install build-essential libpcre3 libpcre3-dev zlib1g-dev git curl gnupg2 ca-certificates lsb-release unzip zip sudo wget curl xz-utils openssl gawk file net-tools -y   #不一定所有都需要,但都是些实用组件

(2)为了支持 TLS 1.3与提高 NGINX 性能,我们需要添加 openssl 最新版和 ngx_brotli

wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz

tar xvf openssl-1.1.1u.tar.gz && rm -rf openssl-1.1.1u.tar.gz

mv openssl-1.1.1u openssl   #下载openssl组件,如遇404错误则说明 openssl 已更新版本,可到官网查看最新版本

git clone https://github.com/google/ngx_brotli.git

cd ngx_brotli

git submodule update --init   #下载ngx_brotli组件

cd ../

(3)做好安装前的准备后就现在可以开始下载 NGINX 并进行编译安装了。第7行为 NGINX 的默认编译参数 + openssl + ngx_brotli 组件。我这里已经将完善的编译参数列出,以后您想要了解新版本的 NGINX 默认安装参数的话,可以采用第二章节的方法先安装 NGINX 的最新版本,然后通过 nginx -V 命令获取。

wget https://nginx.org/download/nginx-1.24.0.tar.gz

tar zxf nginx-1.24.0.tar.gz && rm -rf nginx-1.24.0.tar.gz

mv nginx-1.24.0 nginx

cd nginx/

./configure --add-module=../ngx_brotli --with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module

make

make install

cd ../

(4)编译安装完 NGINX 后,为了能够正常使用,我们还需要进行一系列的设置,比如为 NGINX 添加系统服务:

vi /lib/systemd/system/nginx.service   #编辑此文件

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

#将上述内容添加到 /lib/systemd/system/nginx.service,如果右键粘贴失败,可以修改 /usr/share/vim/vim82/defaults.vim 文件,将 set mouse=a 改为:set mouse-=a。

(5)为 NGINX 添加用户与用户组,和创建一些文件夹:

groupadd nginx

useradd nginx -g nginx -c "nginx user" -d /var/cache/nginx -s /sbin/nologin

mkdir -p /var/cache/nginx

(6)修改 NGINX 的配置文件:编辑 /etc/nginx/nginx.conf,可以直接将其修改为我的模板,不需要修改任何东西就可使用(此配置文件仅适用于完全按照上面步骤来编译安装的 NGINX,仅供参考):

user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

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

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 65;

    gzip on;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_min_length 1000;
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
    
    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;

    client_max_body_size 0;

    include /etc/nginx/conf.d/*.conf;

    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
}

(7)创建或编辑 /etc/nginx/conf.d/default.conf,以下是我的配置文件模板,可参考,但需要根据自己的情况修改一些内容,比如域名、证书等(此配置文件仅适用于完全按照上面步骤来编译安装的 NGINX):

server {
    listen 80;
    listen [::]:80;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2 so_keepalive=on default_server;
    listen [::]:443 ssl http2 so_keepalive=on default_server;

    root /var/www/html;
    index index.php index.html;

    ssl_certificate /etc/nginx/fullchain.pem;
    ssl_certificate_key /etc/nginx/private.key;

    ssl_session_timeout 60m;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Xss-Protection 1;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }

}

(8)此时 NGINX 就已经安装并设置完毕了,可以用以下命令来设置 NGINX 为开机自动启动并立即启动 NGINX:

systemctl enable nginx

systemctl start nginx

4、安装 PHP 7.4 常用组件,Debian 11可以直接 apt 安装

apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-gmp php7.4-curl php7.4-intl php7.4-mbstring php7.4-xmlrpc php7.4-gd php7.4-xml php7.4-cli php7.4-zip php7.4-soap php7.4-imap php7.4-imagick php7.4-bcmath -y

下一步还要修改一些 PHP 的配置文件,编辑 /etc/php/7.4/fpm/pool.d/www.conf 文件,确保下面两行的值与我列出的一模一样,否则可能会出错。

listen.owner = www-data
listen.group = www-data

5、安装 MariaDB

apt install mariadb-server mariadb-client -y

安装完毕后需要进行数据库初始配置,并设置数据库密码:

mysql_secure_installation   #使用此命令进行数据库初始配置,若第一步需要输入密码可直接回车键跳过

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password;

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YOURPASSWORD';   #替换 YOURPASSWORD 为你在刚才设置的密码

导入现有数据库(如果没有可跳过):

mysql -u root -p   #如果前面已经输过了 sudo mysql 这个命令,就可以忽略这一步

create database yourdatabase;   #请将yourdatabasename修改为您的数据库名称

use yourdatabase;

set names utf8;

source /root/yourdatabase.sql;   #从文件目录中导入数据库,该路径只是示范

6、创建网站目录并赋权

mkdir -p /var/www/html   #创建网站目录

usermod -a -G www-data nginx

chown -R www-data /var/www/html   #赋予权限

到这里 LNMP 的搭建就已经结束, 可以将网站文件上传至 /var/www/html 目录体验飞一般的感觉了。当然了,服务器线路不好的话还是飞不起来的。

3 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注