关于 LNMP 环境中的 PHP 安装,请参考:在 ubuntu 22.04 中,通过源码编译安装 LNMP 中的 PHP 环境

系统环境

标题 版本 备注
系统版本 22.04.3 LTS (Jammy Jellyfish) -
内核版本 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux -
Nginx v1.24.0 -

Nginx 介绍

Nginx 官方站点: https://nginx.org/

Nginx(发音同 engine x)是一款高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 由俄罗斯的工程师 Igor Sysoev 开发,最初是为了解决俄罗斯访问量第二的 Rambler.ru 网站的高负载问题。

特点

Nginx 的特点包括:

  • 高性能: Nginx 能够处理并发连接数,并且 CPU 和内存消耗低。
  • 稳定性: Nginx 运行稳定,即使在高负载情况下也能保持稳定运行。
  • 丰富的功能: Nginx 支持多种 HTTP 协议,包括 HTTP/1.0、HTTP/1.1 和 HTTP/2。它还支持反向代理、负载均衡、动静分离、Gzip 压缩等功能。
  • 开源: Nginx 是开源软件,可以免费使用和修改。

Nginx 已经被广泛应用于各种网站和应用程序,包括:

  • 大型网站:淘宝、京东、百度、新浪等
  • 负载均衡:Nginx 可以用于为多个服务器提供负载均衡,提高服务器的利用率和性能。
  • 反向代理:Nginx 可以用于反向代理到不同的服务器,实现动静分离、缓存等功能。
  • 应用程序服务器:Nginx 可以用于作为应用程序服务器,运行 PHP、Python 等应用程序。

优势

Nginx 的优势

Nginx 相比于其他 Web 服务器,具有以下优势:

  • 高性能: Nginx 能够处理更多的并发连接,并且 CPU 和内存消耗更低。
  • 稳定性: Nginx 运行稳定,即使在高负载情况下也能保持稳定运行。
  • 丰富的功能: Nginx 支持多种 HTTP 协议,包括 HTTP/1.0、HTTP/1.1 和 HTTP/2。它还支持反向代理、负载均衡、动静分离、Gzip 压缩等功能。
  • 开源: Nginx 是开源软件,可以免费使用和修改。

场景

Nginx 的应用场景

Nginx 可以用于以下场景:

  • Web 服务器: Nginx 可以用于作为 Web 服务器,提供静态和动态资源的访问。
  • 反向代理: Nginx 可以用于反向代理到不同的服务器,实现动静分离、缓存等功能。
  • 负载均衡: Nginx 可以用于为多个服务器提供负载均衡,提高服务器的利用率和性能。
  • 应用程序服务器: Nginx 可以用于作为应用程序服务器,运行 PHP、Python 等应用程序。

总结

总结

Nginx 是一款高性能、稳定、功能丰富的 Web 服务器,已经被广泛应用于各种网站和应用程序。如果你正在寻找一款优秀的 Web 服务器,Nginx 是一个很好的选择。

Nginx 安装

以下操作都在 root 用户下执行。

脚本安装

手动安装

安装前的准备:

1.添加 nginx 用户,禁止其登陆系统:

1
useradd -s /sbin/nologin nginx

2.安装必要的编译包和模块依赖包:

1
apt install -y gcc g++ git make autoconf automake curl wget libtool libmaxminddb-dev libxslt1-dev libgd-dev libgeoip-dev libgoogle-perftools-dev libperl-dev zlib1g-dev

依赖及模块的下载

下载解压 pcre:

点击这里下载 pcre 源码包到 /usr/local/src/ 目录下并解压

1
2
wget --no-check-certificate -O /usr/local/src/pcre-8.45.tar.gz https://zenlayer.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
tar -zxf /usr/local/src/pcre-8.45.tar.gz -C /usr/local/src/
下载解压 openssl:

点击这里下载 openssl 源码包到 /usr/local/src/ 目录下并解压

1
2
wget -O /usr/local/src/openssl-1.1.1u.tar.gz https://www.openssl.org/source/old/1.1.1/openssl-1.1.1u.tar.gz
tar -zxf /usr/local/src/openssl-1.1.1u.tar.gz -C /usr/local/src/
下载解压 zlib:

点击这里下载 zlib 源码包到 /usr/local/src/ 目录下并解压

1
2
wget -O /usr/local/src/zlib-1.3.1.tar.gz https://www.zlib.net/zlib-1.3.1.tar.gz
tar -zxf /usr/local/src/zlib-1.3.1.tar.gz -C /usr/local/src/

如果这里没有使用 zlib 源码包,则需要使用 apt 命令安装 zlib1g-dev 包。

下载 libatomic_ops 源文件

点击这里从 github 克隆 libatomic_ops 源码文件到 /usr/local/src/ 目录下并执行 ./autogen.sh:

1
2
3
4
5
6
7
8
9
10
11
# 同步的代码
git clone https://github.com/ivmai/libatomic_ops.git /usr/local/src/libatomic_ops

# 进入同步目录
cd /usr/local/src/libatomic_ops

# 生成 configure 文件
./autogen.sh

# 做库文件的软链接
ln -s /usr/local/src/libatomic_ops/src/.libs/libatomic_ops.a /usr/local/src/libatomic_ops/src/
下载 IP 定位模块:ngx_http_geoip2_module

点击这里从 github 克隆 ngx_http_geoip2_module 源码文件到 /usr/local/src/ 目录下:

1
git clone https://github.com/leev/ngx_http_geoip2_module.git /usr/local/src/ngx_http_geoip2_module
下载目录索引模块:ngx-fancyindex

点击这里从 github 克隆 ngx-fancyindex 源码文件到 /usr/local/src/ 目录下:

1
git clone https://github.com/aperezdc/ngx-fancyindex.git /usr/local/src/ngx-fancyindex
下载第三方开源健康检查模块: nginx_upstream_check_module

点击这里从 github 克隆 nginx_upstream_check_module 源码文件到 /usr/local/src/ 目录下:

1
git clone https://github.com/nginx-modules/nginx_upstream_check_module.git /usr/local/src/nginx_upstream_check_module
下载 ngx_devel_kit 源码

点击这里从 github 克隆 ngx_devel_kit 源码文件到 /usr/local/src/ 目录下:

1
git clone https://github.com/vision5/ngx_devel_kit.git
lua-nginx-module 源码

点击这里从 github 克隆 lua-nginx-module 源码文件到 /usr/local/src/ 目录下:

1
git clone https://github.com/openresty/lua-nginx-module.git
下载 openresty 作者提供的 luajit2 源码进行安装

点击这里从 github 克隆 luajit2 源码文件到 /usr/local/src/ 目录下,然后进行安装:

1
2
3
4
5
6
git clone https://github.com/openresty/luajit2.git
make PREFIX=/usr/local/luajit2
make install PREFIX=/usr/local/luajit2
export LUAJIT_LIB=/usr/local/luajit2/lib
export LUAJIT_INC=/usr/local/luajit2/include/luajit-2.1
cp /usr/local/luajit2/lib/libluajit-5.1.so.2 /usr/lib/
下载安装 lua-resty-core

点击这里从 github 克隆 lua-resty-core 源码文件到 /usr/local/src/ 目录下,然后进行安装:

1
2
3
git clone https://github.com/openresty/lua-resty-core.git
cd /usr/local/src/lua-resty-core/
make install LUA_LIB_DIR=/usr/local/share/lua/5.1
下载安装 lua-resty-lrucache

点击这里从 github 克隆 lua-resty-lrucache 源码文件到 /usr/local/src/ 目录下,然后进行安装:

1
2
3
git clone https://github.com/openresty/lua-resty-lrucache.git
cd ../lua-resty-lrucache/
make install LUA_LIB_DIR=/usr/local/share/lua/5.1

下载安装 nginx

1.点击这里从 nginx 官方站点下载 nginx 源码包到 /usr/local/src/ 目录下:

1
wget -O /usr/local/src/nginx-1.24.0.tar.gz http://nginx.org/download/nginx-1.24.0.tar.gz

2.将下载好的源码包解压至下载目录;

1
tar -zxf /usr/local/src/nginx-1.24.0.tar.gz -C /usr/local/src/

3.进入 nginx 解压目录:

1
cd /usr/local/src/nginx-1.24.0/

4.配置 confiugre 参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--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_geoip_module \
--with-http_sub_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_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 \
--http-log-path=/usr/local/nginx/logs/access.log \
--http-client-body-temp-path=/usr/local/nginx/tmp/client_body \
--http-proxy-temp-path=/usr/local/nginx/tmp/proxy \
--http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module \
--with-stream_ssl_preread_module \
--with-google_perftools_module \
--with-cpp_test_module \
--with-compat \
--with-pcre=/usr/local/src/pcre-8.45/ \
--with-zlib=/usr/local/src/zlib-1.3.1/ \
--with-libatomic=/usr/local/src/libatomic_ops/ \
--with-openssl=/usr/local/src/openssl-1.1.1u/ \
--add-module=/usr/local/src/ngx_http_geoip2_module \
--add-module=/usr/local/src/ngx-fancyindex \
--add-module=/usr/local/src/nginx_upstream_check_module \
--add-module=/usr/local/src/ngx_devel_kit \
--add-module=/usr/local/src/lua-nginx-module

5.执行 make 进行编译:

1
make

6.执行 make install 进行安装;

1
make install

7.在 /etc/profile.d/ 目录下创建 nginx 环境配置文件 nginx.sh ,内容为:

1
echo 'PATH=$PATH:/usr/local/nginx/sbin' > /etc/profile.d/nginx.sh && source /etc/profile.d/nginx.sh

8.在 nginx 安装目录 /usr/local/nginx/tmp 目录下创建以下三个目录:

1
mkdir -p /usr/local/nginx/tmp/{client_body,proxy,fastcgi}

9.在 /lib/systemd/system/ 目录下创建 nginx 启动脚本文件 nginx.service ,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat << 'EOF' > /lib/systemd/system/nginx.service
[Unit]
Description=Nginx
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

10.执行命令 systemctl daemon-reload 加载 nginx 脚本:

1
systemctl daemon-reload

11.执行命令 systemctl enable --now nginx.service 启动 nginx 服务并将其设置为开机启动:

1
systemctl enable --now nginx.service

12.执行命令 systemctl status nginx.service 查看 nginx 的状态,如果为 running 则说明 nginx 启动成功,否则,请根据报错信息进行排错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@vm001-ubuntu2204:~# systemctl status nginx.service 
● nginx.service - Nginx
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-04-11 01:31:06 UTC; 41min ago
Process: 40172 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 40173 (nginx)
Tasks: 2 (limit: 9389)
Memory: 1.8M
CPU: 3ms
CGroup: /system.slice/nginx.service
├─40173 "nginx: master process /usr/local/nginx/sbin/nginx"
└─40174 "nginx: worker process" "" "" "" "" "" ""

Apr 11 01:31:06 vm001-ubuntu2204 systemd[1]: Starting Nginx...
Apr 11 01:31:06 vm001-ubuntu2204 systemd[1]: Started Nginx.

13.编辑 nginx 主配置 /usr/local/nginx/conf/nginx.conf,在虚拟主机段添加 lua 解析代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}

location /lua {
default_type "text/plain";
content_by_lua "ngx.say('Lua, how are you?')";
}
}

14.检测 nginx 配置并重载 nginx 服务:

1
nginx -t && nginx -s reload

15.打开浏览器,输入:服务器IP/lua ,如下图:

报错及解决方法

configure 包错

错误一:./configure: error: the HTTP gzip module requires the zlib library.

包错详情:

1
./configure: error: the HTTP gzip module requires the zlib library.

解决方法:

安装 zlib1g-dev 即可

1
$ sudo apt install -y zlib1g-dev

nginx -t 报错

错误一:error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

报错详情:

1
2
root@vm001-ubuntu2204:/usr/local/src/nginx-1.24.0# nginx -t
nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

解决方法:

将 luajit2 安装目录 /usr/local/luajit2/lib/ 下的 libluajit-5.1.so.2 文件复制到 /usr/lib/ 目录下即可

1
cp /usr/local/luajit2/lib/libluajit-5.1.so.2 /usr/lib/

启动报错

错误一:[alert] failed to load the ‘resty.core’ module

报错详情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@vm001-ubuntu2204:/usr/local/src/nginx-1.24.0# nginx 
nginx: [alert] failed to load the 'resty.core' module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module 'resty.core' not found:
no field package.preload['resty.core']
no file './resty/core.lua'
no file '/usr/local/luajit2/share/luajit-2.1/resty/core.lua'
no file '/usr/local/share/lua/5.1/resty/core.lua'
no file '/usr/local/share/lua/5.1/resty/core/init.lua'
no file '/usr/local/luajit2/share/lua/5.1/resty/core.lua'
no file '/usr/local/luajit2/share/lua/5.1/resty/core/init.lua'
no file './resty/core.so'
no file '/usr/local/lib/lua/5.1/resty/core.so'
no file '/usr/local/luajit2/lib/lua/5.1/resty/core.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
no file './resty.so'
no file '/usr/local/lib/lua/5.1/resty.so'
no file '/usr/local/luajit2/lib/lua/5.1/resty.so'
no file '/usr/local/lib/lua/5.1/loadall.so') in /usr/local/nginx/conf/nginx.conf:117

解决方法:

下载 lua-resty-corelua-resty-lrucache 模块进行安装。注意安装目录指定到 LUA_LIB_DIR=/usr/local/share/lua/5.1

安装方法见上面!!!!