[WordPress系列之006] CentOS 7 部署 LNMP 之源码编译安装 Nginx (OpenResty)

By 程序知路 | 2022-03-16
0
(0)

本文主要介绍了 CentOS 7 服务器系统下部署 LNMP 架构中的 “N”,也就是 Nginx 的安装和初始配置。

以及,本文集中了为 LNMP 架构业务需要,而在进行 Nginx 通过源代码编译安装之前需要进行的一些依赖库的安装方法。其中包括: libwebp、OpenSSL 和 libgd。

关于 OpenResty

OpenResty 结合了 Nginx 和 Lua 语言,它集成了大量用 Lua 语言编写的应用库、第三方模块以及大量的依赖项。由于目前本文作者对于 OpenResty 的了解也只限于使用其的基础 Nginx ,故 OpenResty 的其他内涵有待他日去深入。

OpenResty 带 lua-nginx-module 编译安装 Nginx 和 ngx_pagespeed (支持 Nginx 的 WebP 功能,没有支持 HTTP3)。

OpenResty 绑定有 Nginx, ngx_lua (lua-nginx-module,用来启用 WebP 功能), LuaJIT 和其他功能强大的 Nginx 模块和 Lua 库。

不鼓励读者自己用 Nginx 构建这个模块(lua-nginx-module),因为设置得完全正确是很棘手的,建议直接使用 OpenResty,这里面有直接开箱即用的 lua-nginx-module

更多关于 OpenResty 的内容请查阅它的官网: https://openresty.org/

安装依赖

Nginx 的 HTTPS 功能要求系统要安装有 OpenSSL ,在这里部署的 LNMP 架构要求 WebP 的支持,而 WebP 的支持需要安装有 libwebp,libwebp 通过编译时要求 CMake 3.7 及以上版本。

接下下来是安装依赖的过程。

升级 OpenSSl

CentOS 7 自带的 OpenSSL 版本太老,因此要升级它。

这里通过源代码编译升级 OpenSSL 到目前 1.1 版本的最新版。

详情见: [WordPress系列之002]CentOS7 编译升级 OpenSSL 为最新版本

升级 CMake

CMake 是用来构建源代码的工具,一般用于与 make 等工具配合来编译源代码。

升级 CMake 的教程已经写好,详情请移步: [WordPress系列之003]CentOS 7 下编译安装最新稳定版本的 CMake

安装 libwebp

这里要通过源代码编译安装 libwebp 库来支持 WebP。

WebP 是一种压缩效率高、效果好的图像格式,它由谷歌创建并开发,广泛用于 Web 应用程序的图像格式。

具体的编译过程请移步: [WordPress系列之004]CentOS 7 编译安装 libWebP 库

安装 libgd

Nginx 编译时需要 libgd 相关动态库的支持,这里通过源代码编译安装 libgd,以得到更高版本 GD 库的支持。

安装过程请见: [WordPress系列之005] CentOS 7 编译安装 libgd

其他依赖

yum install -y gcc make pcre pcre-devel openssl-devel \
gcc-c++ pcre-devel zlib-devel make unzip openssl \
libxslt-devel libxml2 libxml2-devel geoip-devel \
perl-ExtUtils-Embed libuuid-devel GeoIP GeoIP-data \
redhat-rpm-config.noarch pkgconfig readline-devel postgresql-devel

下载编译 Nginx 时所需的源代码

cd /root
# 如果没有 sources 目录,那么创建之
mkdir sources/
cd sources/

# 添加外部模块
# 按需添加
# 接下来要获取的资源可能会在境外,需要您自己动脑筋想办法获取,作者就不带你在这个问题上飞了,好自为之。

用于清除和设置 HTTP 标头

# 用于清除和设置 HTTP 标头
# 主页在:https://github.com/openresty/headers-more-nginx-module
git clone https://github.com/openresty/headers-more-nginx-module.git

用于设置一些 HTTP 标头,

# 用于设置一些 HTTP 标头,
# 同时把响应标头和响应正文保存到 Memcached
# 如要使用它,系统则必须先安装 Memcached
git clone https://github.com/bpaquet/ngx_http_enhanced_memcached_module.git

用于通过 HTTP 请求清除 FastCGI 等缓存内容

# 用于通过 HTTP 请求清除 FastCGI 等缓存内容
# Install ngx_cache_purge module
git clone https://github.com/nginx-modules/ngx_cache_purge.git

添加 Brotli 的支持

# 添加 Brotli 的支持
git clone --recursive https://github.com/google/ngx_brotli.git
# 在编译条件加上: --add-module=../ngx_brotli。

获取最新稳定版的 ngx_pagespeed 源码

# 获取最新稳定版的 ngx_pagespeed 源码
# 可以到右边网址选择版本 -> https://github.com/apache/incubator-pagespeed-ngx/releases
wget https://github.com/apache/incubator-pagespeed-ngx/archive/refs/tags/v1.13.35.2-stable.tar.gz
tar zxf v1.13.35.2-stable.tar.gz
# 解压得到目录 “incubator-pagespeed-ngx-1.13.35.2-stable”

# 一定要执行这一步,不然要修改编译条件中的路径
mv incubator-pagespeed-ngx-1.13.35.2-stable/ incubator-pagespeed-ngx

下载 ngx_pagespeed 依赖

cd incubator-pagespeed-ngx

wget https://dl.google.com/dl/page-speed/psol/1.13.35.2-x64.tar.gz
tar zxf 1.13.35.2-x64.tar.gz

下载 OenSSL 源码

# 下载 OenSSL 源码
# 这里是 1.1 版本的最新稳定版
cd /root/
cd sources
# 如果前面已经升级了 OpenSSL,
# 那么就直接进行目录重命名的操作
wget https://ftp.openssl.org/source/openssl-1.1.1m.tar.gz
tar zxf openssl-1.1.1m.tar.gz
mv openssl-1.1.1m openssl

下载 OpenResty 的源码:

cd /root/sources

# 下载 OpenResty 的源码:
# 到 https://openresty.org/download/ 下载最新源代码
wget https://openresty.org/download/openresty-1.19.9.1.tar.gz
tar zxf openresty-1.19.9.1.tar.gz
# 解压得到 “openresty-1.19.3.1” 目录
cd openresty-1.19.9.1

编译和安装 Nginx via OpenResty

进行 Nginx 编译前的配置

./configure --prefix=/opt/openresty \
--with-pcre-jit \
--with-ipv6 \
--without-http_redis2_module \
--with-http_iconv_module \
--with-http_postgres_module \
--prefix=/usr/local/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 \
--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 \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module --with-http_v2_module \
--with-http_realip_module --with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_sub_module --with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-http_auth_request_module \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-openssl=../openssl \
--add-dynamic-module=../ngx_http_enhanced_memcached_module \
--add-dynamic-module=../ngx_cache_purge \
--add-module=../ngx_brotli \
--add-dynamic-module=../incubator-pagespeed-ngx

如果此处以动态模块的形式编译 ngx_pagespeed,

那么在使用时就需要在 Nginx 配置文件中的 http 块前面加载 ngx_pagespeed 的动态模块库:

既然在编译 Nginx 时添加了 --modules-path=/usr/lib64/nginx/modules,那么,在加载动态模块时加入模块的绝对路径 load_module "/usr/lib64/nginx/modules/ngx_pagespeed.so";

开始编译 Nginx

gmake

开始安装 Nginx

gmake install

一点手尾

创建 Nginx 运行用户

useradd -M nginx -s /sbin/nologin

新建系统启动初始化脚本

vim /lib/systemd/system/nginx.service

输入以下内容:

如果复制粘贴,那么先在 Vim 里执行 :set paste 命令,再粘贴。这样就避免了行首缩进的问题。

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
# PidFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

对 Nginx 运行环境的设置

touch /run/nginx.pid
chown nginx.nginx /run/nginx.pid

# 如果开启 SELinux
chcon -t httpd_sys_rw_content_t /run/nginx.pid

对 Nginx 配置文件进行必要的修改

vim /etc/nginx/nginx.conf
  • 打开 user 指令的注释并將值修改为 nginx。
  • 打开 pid 的注释并修改为 /run/nginx.pid。

  • 將域名 server_name 指令的值改为绑定的域名,当前是 test.com

  • 由于现时要访问的是 nginx 的缺省页面,所以要把不必要的都注释掉。

创建必需的目录

mkdir /var/cache/nginx/client_temp -p
chown nginx.nginx /var/cache/nginx/ -R

# 站点根目录
# 假设根目录在这儿
# Nginx 默认的就是这个目录
mkdir /var/www
chown nginx.nginx -R /var/www/
# 以上的目录,如果 SELinux 是启用状态的话,
# 还需要设置 SELinux 上下文
# 不然会报错

启动 Nginx

systemctl restart nginx

设置 Nginx 随系统启动

systemctl enable nginx

放开防火墙的端口

80 端口:

firewall-cmd --add-port=80/tcp --permanent
# 永久生效
firewall-cmd --reload
# 查看尚已开放的端口
firewall-cmd --list-all

此外,如果你的服务器所在的云平台还有防火墙,那么你也必须配置这个防火墙,让它允许通过 tcp 80 端口进来。``

测试此时 Nginx 是否支持 WebP:

  1. 假设有张文件名为 test.png 的图片

    把它转换为 WebP 格式

    cwebp test.png -o test.webp
    # 得到 test.webp 图片文件
    # 将它移动到 Web 根目录
    cp test.webp /var/www/
    chown nginx.nginx /var/www/test.webp
    
  2. 在本地电脑通过 curl 命令工具访问远程的 test.webp 文件:
    curl -I http://test.com/test.webp
    

    获得响应标头:

    HTTP/1.1 200 OK
    Server: openresty/1.19.9.1
    Date: Mon, 14 Mar 2022 16:40:32 GMT
    Content-Type: image/webp
    Content-Length: 9666
    ...
    

    标头中有 “image/webp” 表示 Nginx 已经支持 WebP。

部署 LNMP 中的 Nginx 过程就此暂行结束,如有更新,请留意后续。

本文以尽量细致的步骤描述了 CentOS 7 服务器操作系统通过源代码编译的方式安装了 Nginx (OpenResty)的全过程,并处理编译 Nginx 所需的 OpenSSL、LibGD 和 libwebp 等开发库,文章的最后测试了其他格式图片转换成 WebP 的可用性和正确性,而且编译之时带着 ngx_pagespeed,ngx_pagespeed 可以让网站速度优化得更加快。此外,本文还让 Nginx 支持了 Brotli 压缩,Brotli 是一种压缩效率高、效果好的压缩方式。

通过 Yum 而非编译源代码方式来安装 Nginx

其实安装 Nginx 但不要 ngx_pagespeed,可以通过 Yum 命令来安装。

具体请见: Installing Prebuilt CentOS and RHEL Packages

最后,感谢阅读!

欢迎访问本人的博客和关注微信公众号!

相关文章:

喜欢就请您给我评一下分吧!(从左到右为低分到高分)

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.


鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@chengxuzhilu.com