在 Debian 10 上安装 LNMP(NGINX 1.18+MariaDB 10.3+PHP 7.3)

更新日期:2020-10-23

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

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

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

1、编译安装 NGINX 最新版本(当前为1.18.0)+ 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 -y   #不一定所有都需要,但都是些实用组件

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

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

tar xvf openssl-1.1.1h.tar.gz

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

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

cd ngx_brotli

git submodule update --init

cd ../   #下载ngx_brotli组件

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

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

tar zxf nginx-1.18.0.tar.gz

cd nginx-1.18.0/

./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 --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.18.0/debian/debuild-base/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

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/vim81/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;

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

events {
    worker_connections 1024;
    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;

    keepalive_timeout 65;

    gzip on;
    gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/octet-stream;
    
    brotli on;
    brotli_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/octet-stream;

    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):

upstream php-fpm {
    server 127.0.0.1:9000;
}

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

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

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

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

    ssl_certificate /etc/nginx/fullchain.pem;   #SSL证书
    ssl_certificate_key /etc/nginx/private.key;   #SSL密钥

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

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

    add_header Strict-Transport-Security "max-age=63072000" always;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php-fpm;
    }

    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.3 常用组件

apt install software-properties-common -y

apt update

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

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

listen = 127.0.0.1:9000

listen.owner = www-data

listen.group = www-data

5、安装 MariaDB(当前为10.3)

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 目录体验飞一般的感觉了。当然了,服务器线路不好的话还是飞不起来的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注