Nginx的常用配置
1.URI和URL的区别
- URI (Uniform Resource Identifier):
uri
指的是资源的标识符,是相对于服务器根目录的路径部分,不包括协议、主机名和端口。例如,在 URLhttp://www.example.com/path/to/file
中,uri
是/path/to/file
。
- URL (Uniform Resource Locator):
url
指的是资源的完整地址,包括协议、主机名、端口和路径。例如,http://www.example.com/path/to/file
是一个完整的 URL。
2.fastcgi_params
fastcgi_params
文件是 Nginx 中用于配置 FastCGI 代理时所需的参数。FastCGI 是一种协议,用于将请求从 Web 服务器传递到应用服务器(如 PHP、Python 等)。这个文件定义了一组默认的参数,这些参数将被传递给 FastCGI 后端,以便后端能够处理请求。
以下是 fastcgi_params
文件中的内容及其解释:
fastcgi_param QUERY_STRING $query_string; #QUERY_STRING: 传递请求的查询字符串部分,例如 ?foo=bar。
fastcgi_param REQUEST_METHOD $request_method; #REQUEST_METHOD: 传递 HTTP 请求方法(GET、POST 等)。
fastcgi_param CONTENT_TYPE $content_type; #CONTENT_TYPE: 传递请求的内容类型(MIME 类型),例如 text/html。
fastcgi_param CONTENT_LENGTH $content_length; #CONTENT_LENGTH: 传递请求内容的长度。
fastcgi_param SCRIPT_NAME $fastcgi_script_name; #SCRIPT_NAME: 传递脚本名称,通常是请求的 URI。
fastcgi_param REQUEST_URI $request_uri; #REQUEST_URI: 传递原始请求 URI(不包括主机名),例如 /index.php.
fastcgi_param DOCUMENT_URI $document_uri; #DOCUMENT_URI: 传递请求的 URI,通常与 REQUEST_URI 相同。
fastcgi_param DOCUMENT_ROOT $document_root; #DOCUMENT_ROOT: 传递服务器的文档根目录。
fastcgi_param SERVER_PROTOCOL $server_protocol; #SERVER_PROTOCOL: 传递请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1。
fastcgi_param REQUEST_SCHEME $scheme; #REQUEST_SCHEME: 传递请求的协议方案(HTTP 或 HTTPS)。
fastcgi_param HTTPS $https if_not_empty; #HTTPS: 传递 HTTPS 的状态,如果是 HTTPS 请求则传递 on。
fastcgi_param GATEWAY_INTERFACE CGI/1.1; #GATEWAY_INTERFACE: 传递网关接口的版本,这里是 CGI/1.1。
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #SERVER_SOFTWARE: 传递服务器软件名称和版本。
fastcgi_param REMOTE_ADDR $remote_addr; #REMOTE_ADDR: 传递客户端的 IP 地址。
fastcgi_param REMOTE_PORT $remote_port; #REMOTE_PORT: 传递客户端使用的端口号。
fastcgi_param SERVER_ADDR $server_addr; #SERVER_ADDR: 传递服务器的 IP 地址。
fastcgi_param SERVER_PORT $server_port; #SERVER_PORT: 传递服务器使用的端口号。
fastcgi_param SERVER_NAME $server_name; #SERVER_NAME: 传递服务器的主机名。
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200; #REDIRECT_STATUS: 传递重定向状态码,这里设置为 200,这通常用于 PHP,特别是在编译 PHP 时使用了 --enable-force-cgi-redirect 选项。
这些参数对于 Nginx 和后端 FastCGI 服务器之间的通信至关重要,它们帮助 FastCGI 服务器理解并处理来自 Nginx 的 HTTP 请求。
3.项目实战:利用LNMP实现可道云私有云
可道云,原名芒果云,是基于web技术的私有云在线文档管理解决方案。
官网:https://kodcloud.com/
3.1 环境说明
# 部署规划:
10.0.0.107: Rocky Linux 9.3,Nginx 1.26,php-fpm8.0.30,kodbox.1.50
10.0.0.131: Rocky Linux 9.2,MySQL8.0.36,Redis 6.2.7
3.2 准备 MySQL 数据库
[root@Rocky9 ~]# yum -y install mysql-server
[root@Rocky9 ~]# systemctl enable --now mysqld
[root@Rocky9 ~]# mysql
elcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.36 Source distribution
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show schemas;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.22 sec)
mysql> create database kodbox;
Query OK, 1 row affected (0.02 sec)
mysql> create user kodbox@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.05 sec)
mysql> grant all on kodbox.* to kodbox@'10.0.0.%';
Query OK, 0 rows affected (0.02 sec)
3.3 准备 Redis 服务
[root@Rocky9 ~]# yum -y install redis
# 新版本的配置文件都在 /etc/redis/redis.conf,之前老版本的配置文件在/etc/redis.conf
[root@Rocky9 ~]# vim /etc/redis/redis.conf
bind 127.0.0.1 -> bind 0.0.0.0 #修改此行
# 使用 sed 修改
[root@Rocky9 ~]# sed -i 's/^bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
[root@Rocky9 ~]# systemctl enable --now redis
3.4 准备 Nginx 服务
[root@Rocky93 ~]# yum install nginx -y
[root@Rocky93 ~]# mkdir -pv /data/html
mkdir: created directory '/data'
mkdir: created directory '/data/html'
[root@Rocky93 ~]# vim /etc/nginx/conf.d/kod.conf
server {
listen 80;
server_name cloud.kod.org;
root /data/html;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@Rocky93 ~]#systemctl enable --now nginx
3.5 PHP 扩展 session 模块支持 Redis
PECL是 PHP 扩展的存储库,提供用于下载和开发 PHP 扩展的所有已知扩展和托管功能的目录
官网: https://pecl.php.net/package/redis
开始在 PHP 中使用 Redis 前, 需要确保已经安装了 redis 服务及 PHP redis 驱动。编译安装使用这个,下面是通过yum源安装的,就是php80-php-pecl-redis6
3.6 安装和配置 php 支持 Redis
# 更新yum源
[root@Rocky93 ~]#yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-9.rpm
[root@Rocky93 ~]#yum -y install php80-php-fpm php80-php-mysqlnd php80-php-pecl-redis6 php80-php-mbstring php80-php-xml php80-php-gd
[root@Rocky93 ~]#vim /etc/opt/remi/php80/php-fpm.d/www.conf
user = nginx
group = nginx
;使用sockt套接字的话是看不到9000端口的,可以修改成下面的
;listen = /var/opt/remi/php80/run/php-fpm/www.sock
listen = 127.0.0.1:9000
# 注释掉文件结尾的两行,添加下面两行
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://10.0.0.131:6379"
# 启动php-fpm
[root@Rocky93 ~]# systemctl enable --now php80-php-fpm.service
Created symlink /etc/systemd/system/multi-user.target.wants/php80-php-fpm.service → /usr/lib/systemd/system/php80-php-fpm.service.
[root@Rocky93 ~]#
如果不安装 php80-php-mbstring php80-php-xml php80-php-gd 这三个包,在安装过程中提示下面错误
3.7 准备可道云程序
[root@Rocky93 ~]#wget https://static.kodcloud.com/update/download/kodbox.1.50.zip
[root@Rocky93 ~]#unzip kodbox.1.50.zip -d /data/html/
[root@Rocky93 ~]#chown -R nginx.nginx /data/html/
3.8 初始化和登录可道云
4.Nginx 二次开发版本
4.1 Tengine
Tengine 是由淘宝(阿里巴巴集团)主导开发的一个Web服务器项目,它是在 Nginx 基础上进行了增强和扩展。Tengine 旨在提供更高的性能和稳定性,同时增加了一些特性,以满足大规模网站的需求。
官网 - The Tengine Web Server (taobao.org)
官方文档 - The Tengine Web Server (taobao.org)
继承Nginx-1.24.0的所有特性,兼容Nginx的配置;
支持域名,证书,路由的动态无损生效;
支持HTTP/3 (QUIC v1和draft-29);
支持bypass内核的用户态高性能UDP转发;
支持基于header,cookie,query和服务权重的高级路由动态无损生效;
支持基于高级路由的请求和响应流量染色动态无损生效;
支持配置分域名TLS多版本,timeout,强制HTTPS,CORS和robots的动态无损生效;
支持HTTP的CONNECT 方法,可用于正向代理场景;
增强相关运维监控能力,比如异步打印日志及回滚,本地DNS缓存,内存监控等;
流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;
支持异步OpenSSL,可使用硬件如:QAT进行HTTPS的加速与卸载;
更加强大的负载均衡能力,包括一致性hash模块,会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;
4.1.1 编译安装 Tengine-3.1.0
注意:在Tengine-2.3.0版本后废弃Tengine的dso_tool工具以及dso配置指令,若之前有使用Tengine的dso功能、则可以切换到Nginx官方的load_module指令,详细文档参考1 和 参考2。
动态加载模块 - The Tengine Web Server (taobao.org)
CentOS 7: Tengine 的任何版本都可以在 CentOS 7 上面安装;
Rocky 8: 只有 Tengine-2.3.0到Tengine-3.1.0 这些版本可以在Rocky 8上面安装,2.3.0以前的只能在CentOS 7上面安装部署;
Rocky 9: 只有 Tengine-2.4.0到Tengine-3.1.0 这四个版本可以在 Rocky 9 以上版本安装。
# RedHat 系列安装的包
[root@Rocky93]#yum -y install gcc pcre-devel openssl-devel make
# Ubuntu 系列安装的包
[root@ubuntu ~]#apt update
[root@ubuntu ~]#apt install gcc libssl-dev libpcre3-dev zlib1g-dev make
[root@Rocky93]#useradd -r -s /sbin/nologin nginx
[root@Rocky93]#wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz
[root@Rocky93]#tar xf tengine-3.1.0.tar.gz
# 检查(--with-http_lua_module=shared --with-http_concat_module=shared 高版本中这些参数已经不支持了,只有在2.3.0之前才支持)
[root@Rocky93]#./configure --prefix=/apps/tengine-3.1.0 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
# 根据 Makefile 中定义的规则来编译源代码
[root@Rocky93]#make
# 根据 Makefile 中定义的安装规则,将编译生成的文件复制到系统的指定目录(通常是 /usr/local/bin, /usr/local/lib 等)。
[root@Rocky93]#make install
[root@Rocky93]#ln /apps/tengine-3.1.0/sbin/nginx /usr/sbin/
4.2 OpenResty
- OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模 块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务 和动态网关。
- OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言 调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高 性能 Web 应用系统
- OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型, 不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应
官网:https://openresty.org/cn/
4.2.1 编译安装 OpenResty
# RedHat 系列需要安装的包
[root@Rocky9 ~]# dnf -y install gcc pcre-devel openssl-devel perl
# Debian 系列,例如Ubuntu需要安装的包
[root@ubuntu ~]# apt install gcc libssl-dev libpcre3-dev
# 创建用户
[root@Rocky9 ~]#groupadd -r -g 123 nginx
[root@Rocky9 ~]#useradd -r -g nginx -u 123 -s /sbin/nologin nginx
# 下载源码包并编译安装
[root@Rocky9 ~]# wget https://openresty.org/download/openresty-1.25.3.1.tar.gz
[root@Rocky9 ~]# tar xf openresty-1.25.3.1.tar.gz openresty-1.25.3.1/
[root@Rocky9 ~]# cd openresty-1.25.3.1/
[root@Rocky9 ~]# ./configure --prefix=/apps/openresty --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@Rocky9 ~]# make && make install
# 查看
[root@Rocky9 ~]# ls /apps/openresty/
bin COPYRIGHT luajit lualib nginx pod resty.index site
[root@Rocky9 ~]# ln /apps/openresty/bin/* /usr/bin/
# 查看版本
[root@Rocky9 ~]# openresty -v
nginx version: openresty/1.25.3.1
[root@Rocky9 ~]#