CentOS 7 安装 LNMP(NGINX 1.18.0+MariaDB 10.4.12+PHP 7.4)

更新日期:2020-04-23

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

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

在这篇教程中我将提供三种安装 NGINX 的方式,选择其中一种方式安装即可:

第1种是编译安装,优点是能够安装最新版本的 NGINX 和 openssl、ngx_brotli 等组件、自定义性强,缺点则是过程较为繁琐,更新版本也较为复杂。此方式对应第1章内容。

第2种是通过 NGINX 官方 yum 源安装,能够安装最新版本的 NGINX,但不包含 openssl 和 ngx_brotli 组件,直接影响是无法启用 TLS 1.3。如果不需要 TLS 1.3 的话可以选择这种方式,安装过程十分简单,更新版本也很容易。此方式对应第2章内容。

第3种是通过 codeIT 的 yum 源安装,安装的 NGINX 版本不是最新版,但包含 openssl 和 ngx_brotli 组件,可以使用 TLS 1.3,安装过程十分简单,更新版本也很容易,但安装目录文件可能与官方源安装的略有不同。此方式对应第3章内容。

1、编译安装 NGINX 最新版本(当前为1.18.0)+ openssl + ngx_brotli

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

yum update -y

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum install git gcc clang automake make autoconf libtool zlib-devel libatomic_ops-devel pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel gperftools-devel  perl-devel perl-ExtUtils-Embed perl wget perl-core unzip zip -y   #不一定所有都需要,但都是些实用组件

(2)为了支持 TLS 1.3与提高 NGINX 性能,我们需要添加 openssl 最新版和 ngx_brotli,如果不需要以上功能,可选择其他安装 NGINX 的方法

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

tar xvf openssl-1.1.1g.tar.gz

mv openssl-1.1.1g 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/lib64/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='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -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

#将3-17行内容添加到 /lib/systemd/system/nginx.service

(5)为 NGINX 添加用户与用户组:

groupadd nginx

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

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

user  nginx;
worker_processes  1;

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

events {
    worker_connections  1024;
}

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;

    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;

    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;

    server_names_hash_bucket_size 64;

    client_max_body_size 100m;

    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 default_server;
    listen [::]:80 default_server;
    server_name yourdomain.com;   #修改为你的域名

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

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yourdomain.com;   #修改为你的域名

    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 on;

    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;

    ssl_buffer_size 8k;

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

    access_log /var/log/nginx/yourdomain.com.access.log;   #修改为你的域名
    error_log /var/log/nginx/yourdomain.com.error.log;   #修改为你的域名

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

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

    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

【非必需】2、通过 yum 安装 NGINX 最新版本。该部分仅适用于不需要 openssl 最新版和 ngx_brotli 组件的用户,若已在第1章节中通过编译安装 NGINX ,请无视该章节。

vi /etc/yum.repos.d/nginx.repo   #编辑该文件,添加源

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

#将3-7行内容添加到 /etc/yum.repos.d/nginx.repo

yum install nginx -y

systemctl enable nginx

systemctl start nginx

【非必需】3、通过 codeIT 的 yum 源安装 NGINX。安装的 NGINX 版本不是最新版,但包含 openssl 和 ngx_brotli 组件,可使用 TLS 1.3,若已通过前面章节的方式安装 NGINX ,请无视该章节。

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

vi /etc/yum.repos.d/nginx.codeIT.el7.repo   #创建此文件

[CodeIT]
name=CodeIT repo
baseurl=https://repo.codeit.guru/packages/mainline/centos/7/$basearch
enabled=1
gpgkey=https://repo.codeit.guru/RPM-GPG-KEY-codeit
gpgcheck=1

#将5-10行的内容添加到 /etc/yum.repos.d/nginx.codeIT.el7.repo

yum install nginx -y

systemctl enable nginx

systemctl start nginx

4、安装 PHP 7.4 常用组件

rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm

yum install yum-utils -y

yum-config-manager --enable remi-php74

yum install -y php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl php-mysqli php-intl php-exif php-openssl php-xmlrpc php-soap php-pecl-imagick php-pecl-zip php-process

systemctl start php-fpm

systemctl enable php-fpm

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

user = nginx

group = nginx

listen = /run/php-fpm/php-fpm.sock

listen.acl_users = apache,nginx

5、安装 MariaDB 最新版(当前为10.4.12)

vi /etc/yum.repos.d/MariaDB.repo   #编辑此文件

[mariadb]
name = MariaDB
baseurl = https://yum.mariadb.org/10.4.12/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

#将3-7行内容添加到 /etc/yum.repos.d/MariaDB.repo

yum install MariaDB-server MariaDB-client -y

systemctl start mariadb

systemctl enable mariadb

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

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

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

mysql -u root -p

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

use yourdatabase;

set names utf8;

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

6、创建网站目录并赋权

chown -R root:nginx /var/lib/php   #赋予权限

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

chown -R nginx:nginx /var/www/html   #赋予权限,注意,要在上传完网站文件之后再赋权,否则没有效果

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

发表评论

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