Nginx
Nginx简介
nginx
(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx
由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。
第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
nginx
的特点是占有内存少,并发能力强,事实上nginx
的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx
网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx的特点和优点
nginx的特性:
nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
- 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应(但是一般是3万多)
- 使用epoll and kqueue作为开发模型
- nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
- nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多
nginx的优点:
-
高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
-
内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
-
配置文件非常简单:风格跟程序一样通俗易懂
-
成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
-
支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
-
内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
-
节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
-
稳定性高:用于反向代理,宕机的概率微乎其微
-
模块化设计:模块可以动态编译
-
外围支持好:文档全,二次开发和模块较多
-
支持热部署:可以不停机重载配置文件
-
支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
Nginx的功能及应用
nginx的基本功能
-
静态资源的web服务器,能缓存打开的文件描述符
-
http、smtp、pop3协议的反向代理服务器
-
缓存加速、负载均衡
-
支持FastCGI(fpm,LNMP),uWSGI(Python)等
-
模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
-
支持SSL
nginx的扩展功能
-
基于名称和IP的虚拟主机
-
支持keepalive
-
支持平滑升级
-
定制访问日志、支持使用日志缓冲区提高日志存储性能
-
支持URL重写
-
支持路径别名
-
支持基于IP及用户的访问控制
-
支持速率限制,支持并发数限制
nginx的应用类别
- 使用nginx结合FastCGI运行PHP、JSP、Perl等程序
- 使用nginx作反向代理、负载均衡、规则过滤
- 使用nginx运行静态HTML网页、图片
- nginx与其他新技术的结合应用
nginx的模块与工作原理
nginx
由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
nginx的模块分类
nginx的模块从结构上分为核心模块、基础模块和第三方模块
-
HTTP模块、EVENT模块和MAIL模块等属于核心模块
-
HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
-
HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
nginx模块从功能上分为三类,分别是:
-
Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
-
Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
-
Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
-
核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
-
事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
-
配置模块:提供包含机制
安装Nginx
环境准备:Centos8
关闭防火墙和SElinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
配置yum源rpel源
cd /etc/yum.repos.d/
rm -rf *
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
yum clean all
现在Nginx源码包
cd /opt/
wget https://nginx.org/download/nginx-1.22.1.tar.gz
tar -xf nginx-1.22.1.tar.gz //解压
创建系统用户nginx
useradd -r -s /sbin/nologin -M nginx
安装依赖包
yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
创建日志存放目录
mkdir -p /var/log/nginx
chown nginx.nginx /var/log/nginx //修改所有者和所属组
编译安装
cd nginx-1.22.1/
./configure
--prefix=/usr/local/nginx //指定安装路径
--user=nginx //指定用户
--group=nginx //指定用户主
--with-debug //启用调试日志。
--with-http_ssl_module //启用 HTTPS 协议支持,需要 OpenSSL 库。默认情况下未构建此模块。
--with-http_realip_module //启用 ngx_http_realip_module 模块的功能,该模块将客户端地址更改为在指定的 "header " 字段中发送的地址。默认情况下未构建此模块。
--with-http_image_filter_module //启用 ngx_http_image_filter_module 模块,该模块可以转换 JPEG,GIF,PNG 和 WebP 格式的图像。构建和运行此模块需要 libgd 库。默认情况下未构建此模块
--with-http_gunzip_module //对于不支持 “gzip” 的客户端,启用 ngx_http_gunzip_module 模块,使用 “Content-Encoding: gzip” 解压缩响应。默认情况下未构建此模块。
--with-http_gzip_static_module //启用 ngx_http_gzip_static_module 模块,该模块支持发送扩展名为 “.gz” 的预压缩文件,而不是常规文件。默认情况下未构建此模块
--with-http_stub_status_module //启用 ngx_http_stub_status_module 模块,该模块提供对基本状态信息的访问。默认情况下未构建此模块
--http-log-path=/var/log/nginx/access.log //HTTP 服务器的主请求日志文件的名称。默认值:<prefix>/logs/access.log。安装后,可以使用 nginx.conf 中的 access_log 指令更改。
--error-log-path=/var/log/nginx/error.log //错误日志文件的名称。默认值:<prefix>/logs/error.log。安装后,可以使用 nginx.conf 中的 error_log 指令更改
echo $? //验证是否成功编译
make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install //安装
echo $? //验证
ls /usr/local/nginx/ //查看是否产生对应文件
Nginx 编译参数详解
–prefix=path //nginx 程序目录。默认值:/usr/local/nginx
–conf-path=path //nginx 配置文件的名称。默认值:/conf/nginx.conf。但是,在启动时通过 -c filename 指定的配置文件优先级最高。
–sbin-path=path //nginx 可执行文件的名称,仅在安装期间使用。默认值:/sbin/nginx。
–pid-path=path //nginx.pid 文件的名称。默认值:/logs/nginx.pid。安装后,可以使用 nginx.conf 中的 pid 指令更改
–error-log-path=path //错误日志文件的名称。默认值:/logs/error.log。安装后,可以使用 nginx.conf 中的 error_log 指令更改。
–http-log-path=path //HTTP 服务器的主请求日志文件的名称。默认值:/logs/access.log。安装后,可以使用 nginx.conf 中的 access_log 指令更改。
–lock-path=path //为锁定文件的名称设置前缀。默认值:/logs/nginx.lock。安装后,可以使用 nginx.conf 中的 lock_file 指令更改
–user=name //nginx 运行用户。默认值:nobody。安装后,可以使用 nginx.conf 中的 user 指令更改
–group=name //nginx 运行组。默认值:--user
指定的值。安装后,可以使用 nginx.conf 中的 user 指令更改。
–http-client-body-temp-path=path //定义用于存储包含客户端请求正文的临时文件的目录。默认值:/client_body_temp。安装后,可以使用 nginx.conf 中的 client_body_temp_path 指令更改。
–http-proxy-temp-path=path //定义用于存储包含从代理服务器接收到的数据的临时文件。默认值:/proxy_temp。安装后,可以使用 nginx.conf 中的 proxy_temp_path 指令更改。
–http-uwsgi-temp-path=path //定义用于存储带有从 uwsgi 服务器接收到的数据的临时文件。默认值:/uwsgi_temp。安装后,可以使用 nginx.conf 中的 uwsgi_temp_path 指令更改。
–http-scgi-temp-path=path //定义用于存储包含从 SCGI 服务器接收到的数据的临时文件。默认值:/scgi_temp。安装后,可以使用 nginx.conf 中的 scgi_temp_path 指令更改。
默认构建的模块
–without-http_charset_modul //禁用 ngx_http_charset_module 模块,该模块将指定的字符集添加到 “Content-Type” 响应头字段中,还可以将数据从一种字符集转换为另一种字符集,但有一些限制。
–without-http_gzip_module //禁用 ngx_http_gzip_module 模块。
–without-http_ssi_module //禁用 ngx_http_ssi_module 模块。该模块用于处理通过它的响应中的 SSI(服务器端包含)命令。
–without-http_userid_module //禁用 ngx_http_userid_module 模块,该模块设置适用于客户端标识的 cookie。
–without-http_access_module //禁用 ngx_http_access_module 模块,该模块允许限制对某些客户端地址的访问。
–without-http_auth_basic_module //禁用 ngx_http_auth_basic_module 模块,该模块允许通过使用 “HTTP Basic Authentication” 协议验证用户名和密码来限制对资源的访问。
–without-http_mirror_module //禁用 ngx_http_mirror_module 模块。
–without-http_autoindex_module // 禁用 ngx_http_autoindex_module 模块。该模块处理以斜杠字符 “/” 结尾的请求,并生成目录列表。
–without-http_geo_module //禁用 ngx_http_geo_module 模块,该模块使用取决于客户端 IP 地址的值来创建变量
默认未构建的模块
PS:dynamic,表示支持动态加载的模块。
–with-select_module
启用 select() 方法的模块。
–with-poll_module
启用 poll() 方法的模块。
–with-threads
启用线程池的使用。
–with-file-aio
启用异步文件I/O(AIO)。
–with-http_ssl_module
启用 HTTPS 协议支持,需要 OpenSSL 库。默认情况下未构建此模块。
–with-openssl=path
设置 OpenSSL 库源的路径。
–with-openssl-opt=parameters
为 OpenSSL 设置其他构建选项。
–with-http_v2_module
启用 HTTP/2 协议支持。默认情况下未构建此模块。
–with-http_realip_module
启用 ngx_http_realip_module 模块的功能,该模块将客户端地址更改为在指定的 "header " 字段中发送的地址。默认情况下未构建此模块。
–with-http_addition_module
启用 ngx_http_addition_module 模块,该模块可在响应之前和之后添加文本。默认情况下未构建此模块。
–with-http_sub_module
启用 ngx_http_sub_module 模块,该模块通过将一个指定的字符串替换为另一个指定的字符串来修改响应。默认情况下未构建此模块。
–with-http_dav_module
启用 ngx_http_dav_module 模块,该模块通过 WebDAV 协议提供文件管理自动化。默认情况下未构建此模块。
–with-http_flv_module
启用 ngx_http_flv_module 模块,该模块为 Flash Video (FLV) 文件提供伪流服务器端支持。默认情况下未构建此模块。
–with-http_mp4_module
启用 ngx_http_mp4_module 模块,该模块为 MP4 文件提供伪流服务器端支持。默认情况下未构建此模块。
–with-http_gunzip_module
对于不支持 “gzip” 的客户端,启用 ngx_http_gunzip_module 模块,使用 “Content-Encoding: gzip” 解压缩响应。默认情况下未构建此模块。
–with-http_gzip_static_module
启用 ngx_http_gzip_static_module 模块,该模块支持发送扩展名为 “.gz” 的预压缩文件,而不是常规文件。默认情况下未构建此模块。
–with-http_auth_request_module
启用 ngx_http_auth_request_module 模块,该模块基于子请求的结果实现客户端授权。默认情况下未构建此模块。
–with-http_random_index_module
启用 ngx_http_random_index_module 模块,该模块处理以斜杠 “/” 结尾的请求,并在目录中选择一个随机文件作为索引文件。默认情况下未构建此模块。
–with-http_secure_link_module
启用 ngx_http_secure_link_module 模块。该模块用于检查请求链接的真实性,保护资源不受未经授权的访问,并限制链接生存期。默认情况下未构建此模块。
–with-http_degradation_module
启用 ngx_http_degradation_module 模块。默认情况下未构建此模块。
–with-http_slice_module
启用 ngx_http_slice_module 模块,该模块将请求拆分为多个子请求,每个子请求都返回一定范围的响应。可为大响应提供更有效的缓存。默认情况下未构建此模块。
–with-http_stub_status_module
启用 ngx_http_stub_status_module 模块,该模块提供对基本状态信息的访问。默认情况下未构建此模块。
–with-http_xslt_module
–with-http_xslt_module=dynamic
启用 ngx_http_xslt_module 模块,该模块是一个过滤器,可使用一个或多个 XSLT 样式表转换 XML 响应。构建和运行此模块需要 libxml2 和 libxslt 库。默认情况下未构建此模块。
–with-http_image_filter_module
–with-http_image_filter_module=dynamic
启用 ngx_http_image_filter_module 模块,该模块可以转换 JPEG,GIF,PNG 和 WebP 格式的图像。构建和运行此模块需要 libgd 库。默认情况下未构建此模块。
–with-http_geoip_module
–with-http_geoip_module=dynamic
启用 ngx_http_geoip_module 模块,该模块根据客户端 IP 地址和预编译的 MaxMind 数据库创建变量。默认情况下未构建此模块。
–with-google_perftools_module
启用 ngx_google_perftools_module 模块,以使用 Google Performance Tools 对 nginx 性能分析。该模块供 ngin 开发人员使用。默认情况下未构建。
–with-cpp_test_module
启用 ngx_cpp_test_module 模块。
–with-compat
启用动态模块兼容性。
–with-cc=path
设置 C 编译器的名称。
–with-cpp=path
设置 C 预处理器的名称。
配置环境变量
echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh //使用export命令直接修改PATH的值,配置nginx进入环境变量的方法:
source /etc/profile.d/nginx.sh //执行脚本
//服务控制方式,使用nginx命令
-t //检查配置文件语法
-v //输出nginx的版本
-c //指定配置文件的路径
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
启动服务
nginx //启动
ss -ntl //查看端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
//80端口以产生
验证页面
nginx的配置文件详解
主配置文件:/usr/local/nginx/conf/nginx.conf
-
默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
-
可以在启动nginx时通过-c选项来指定要读取的配置文件
nginx常见的配置文件及其作用
nginx.conf的内容分为以下几段:
main配置段:全局配置段。其中main配置段中可能包含event配置段
event {}:定义event模型工作特性
http {}:定义http协议相关的配置
配置指令:要以分号结尾,语法格式如下:
derective value1 [value2 ...];
配置文件 作用
nginx.conf nginx的基本配置文件
mime.types MIME类型关联的扩展文件
fastcgi.conf 与fastcgi相关的配置
proxy.conf 与proxy相关的配置 //yum安装才有
sites.conf 配置nginx提供的网站,包括虚拟主机 //yum安装才有
支持使用变量:
- 内置变量:模块会提供内建变量定义
- 自定义变量:
set var_name value
修改nginx.conf配置文件时,尽量cp一份配置文件到其他目录,以避免配置文件修改坏,nginx服务出错
cp /usr/local/nginx/conf/nginx.conf /opt/ //cp一份到/opt/目录下
#跟换配置文件位置时,需要先stop nginx服务
nginx -s stop //停止服务
修改/opt/nginx.conf文件(添加一段文件例如:#whd555)
vim /opt/nginx.conf
#whd555
## nginx -c 文件 指定文件启动的路径
nginx -c /opt/nginx.conf
nginx: [emerg] open() "/opt/mime.types" failed (2: No such file or directory) in /opt/nginx.conf:18 //报错缺少mime.types文件
cp /usr/local/nginx/conf/mime.types /opt/ //cp一份到/opt下 与nginx.conf在同一目录
nginx -c /opt/nginx.conf //在次启动
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
##ok 启动成功
##简易网站配置文件
user nginx;
event {
worker_connection 1024;
}
http {
server {
server_name www.whd555.com: //网站域名
listen 80; //监听端口
location /{ //根页面
root html; //主页目录
index index.html //主页名字
}
}
}
调试,定位问题的配置参数 :
daemon {on | off} //是否以守护进程的方式运行nginx,调试时应设置为off
msater_process {on | off} //是否以master/worker模型来运行nginx,调试应设为off
error_log 位置 级别: //配置错误日志
在nignx.conf配置文件中没有master_process 则nginx中默认为on
ps -ef | grep nginx
root 1700 1 0 08:37 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 1701 1700 0 08:37 ? 00:00:00 nginx: worker process
当在配置文件nginx.conf中添加master_process off
vim /opt/nginx.conf
master_process off;
nginx -c /opt/nginx.conf //启动服务
ps -ef | grep nginx //查看进程
root 1769 1 0 09:00 ? 00:00:00 nginx -c /opt/nginx.conf //没有master/worker 进程
注意:改变工作模式时: reload 是不生效的 需要重启
注释nginx.conf文件中的日志
ls /usr/local/nginx/logs/ //查看安装路径下的log目录下是否有文件
vim /opt/nginx.conf
error_log logs/error.log; //有3条日志
nginx //启动服务
ls /usr/local/nginx/logs/
nginx.pid //产生了文件
正常运行必备的配置参数
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
pid /path/to/pid_file //指定nginx pid文件的位置
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024 ( 需要配置时 一般配置数为 65355)
worker_rlimit_core size; //指明所有worker进程所能使用的总体的最大核心文件大小,保持默认即可 (现版本以默认配置)
优化性能的配置参数
worker_process n ; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为比cpu总核心数少一,即n-1
worker_cpu_affinity cpumask …; //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask; 使用8位二进制表示cpu 核心数:
vim /opt/nginx.conf
worker_processes 4; //修改进程数
worker_cpu_affinity 0001 0010 0100 1000; //绑定cpu
nginx -c /opt/nginx.conf
ps -ef |grep nginx //查看进程
root 1953 1 0 09:48 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 1954 1953 0 09:48 ? 00:00:00 nginx: worker process
nginx 1955 1953 0 09:48 ? 00:00:00 nginx: worker process
nginx 1956 1953 0 09:48 ? 00:00:00 nginx: worker process
nginx 1957 1953 0 09:48 ? 00:00:00 nginx: worker process