Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,也是一个 IMAP/POP3 邮件代理服务器。它以其高并发处理能力和低资源消耗而闻名,能够同时处理数千个连接。
Nginx 的主要功能包括:
-
静态资源服务器:Nginx 可以担任静态资源服务器的角色,高效地提供静态内容,如 HTML、图片、视频等,因其采用事件驱动架构,能够比传统服务器处理更多的并发请求。
-
反向代理和负载均衡:Nginx 可以作为反向代理服务器,将客户端请求分发到后端多个服务器上,从而实现负载均衡。它支持多种负载均衡算法,如轮询、IP 哈希等。
-
SSL/TLS 支持:Nginx 支持 SSL/TLS 协议,可以用来配置 HTTPS 站点,保证数据传输的安全性。
-
动静分离:Nginx 可以根据请求的类型(如静态资源请求或动态应用请求)将它们分发到不同的服务器,这种方式提高了站点的性能。
-
模块化架构:Nginx 的功能可以通过各种模块进行扩展,例如 Gzip 压缩、访问控制、日志记录等。
-
高可用性和容错性:通过与其他工具(如 Keepalived)结合,Nginx 可以实现高可用性,确保服务的连续性。
Nginx 的设计目标之一是提高服务器的性能和稳定性,同时减少服务器资源的消耗,这使得它成为处理高并发请求的理想选择。Nginx 现已广泛应用于大中型网站和云服务中,成为全球最受欢迎的 Web 服务器之一。
nginx可以直接通过yum install安装,不过这样只能安装基础的nginx,如果引入更多模块的功能,所以手动编译部署,可以使用nginx更多功能,并且自定义其应该具有什么模块和功能。
Nginx编译
nginx是一个高度模块化的中间件,其各个功能分为不同的模块,甚至不同的文件。我们下载的nginx模块,通常只包括核心模块,和一部分可选模块。我们还可以通过下载其他开发者或社区开发的模块,在编译时进行引入,这些由非官方个人或团队开发和维护的模块,叫第三方模块。
核心模块
其中核心模块是编译时必须且自动选择的,其中包含如下模块:
- ngx_core_module:提供了全局配置选项,如 user、worker_processes、error_log、pid 等。
- ngx_errlog_module:管理错误日志的记录。
- ngx_events_module:处理 Nginx 的事件驱动机制,控制服务器的并发处理能力。
- ngx_http_core_module:用于处理 HTTP 请求的核心模块。
- ngx_http_log_module:访问日志记录模块。
可选模块
还有一部分模块,虽然是自带于nginx中,不过需要在编译时,通过--with-选项,选择性的进行添加,模块如下:
HTTP 模块:
- http_ssl_module:启用 SSL/TLS 支持,用于处理 HTTPS 请求。
- http_v2_module:启用 HTTP/2 支持,优化网页加载速度。
- http_gzip_static_module:启用 Gzip 静态文件支持,减少带宽消耗。
- http_stub_status_module:提供服务器运行状态的监控接口。
- http_realip_module:处理代理服务器后的真实客户端 IP 地址。
- http_auth_request_module:通过子请求实现用户身份验证。
- http_sub_module:在响应内容中替换文本。
- http_geoip_module:基于 IP 地址提供地理位置信息。
流模块(用于 TCP/UDP 处理):
- stream:启用 TCP/UDP 流量处理。
- stream_ssl_module:为 TCP/UDP 流量处理启用 SSL 支持。
- stream_realip_module:获取真实客户端 IP 地址。
邮件模块(用于邮件代理):
- mail:启用邮件代理功能(SMTP/IMAP/POP3)。
- mail_ssl_module:为邮件代理启用 SSL 支持。
第三方模块
第三方模块由个人或其他社区开发和维护,用来扩展nginx的功能,通过--add-module=path/to/module的形式进行引入。
编译过程
编译过程需要先下载编译所需工具,以及nginx源代码。然后通过configure可执行文件,来启动对应模块,然后在通过make install命令,进行编译。我们这里以引入可选模块http_ssl_module 和with-http_gzip_static_module为例,具体命令如下:
#首先下载编译所需工具
yum groupinstall 'Development Tools'
yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
#下载nginx源码并解压
cd /
wget https://nginx.org/download/nginx-1.26.1.tar.gz
tar -xf /nginx-1.26.1.tar.gz
#编译nginx
./configure --prefix=/nginx --with-http_ssl_module --with-http_gzip_static_module
make
make install
下载完成后可以如下命令,来验证nginx是否安装成功,以及安装模块内容:
/nginx/sbin/nginx -V #注意v是大写,小写不会打印模块信息
得到如下结果,证明nginx安装成功,并且可以查看到我们刚刚的模块信息。
除了这些可选模块外,我们还可以通过实际需求,引入第三方模块,这里就不举例了。
常用配置项
完成nginx编译后,我们可以在之前编译指定的目录,也就是/nginx目录下,看到四个文件夹,分别是conf,html,logs以及sbin。其中sbin内部保存了我们编译后的nginx可执行文件,我们对于nginx服务的一切操作都要使用这个nginx可执行文件。
conf目录下有一个nginx.conf,我们就需要在这里对nginx进行配置,里面的初始内容如下:
可以看到,nginx的配置也是基于模块的,从上至下,分别可以看到全局配置项,events模块,以及http模块。
http模块内部还要定义虚拟主机的配置,也就是server,虚拟主机可以有多个。server下配置了监听端口,域名,以及访问路径映射规则(location)。
我们直接通过/nginx/sbin/nginx,执行nginx可执行文件,启动nginx,然后直接通过http协议访问主机ip(不需要端口),看到如下页面,证明访问nginx成功。
必须通过http访问,因为https写一下需要对数据进行加密传输,nginx默认没有开启ssl对数据加密,会导致三次握手失败,可以在server的listen配置端口后面加一个ssl启用ssl加密,不过还需要获取证书,过程繁琐,这里主要演示nginx的基本使用,不做过多说明。
http协议下默认访问80端口,所以通过http访问nginx所在地址时,不需要加端口。https默认访问443端口
server_name
通过配置server_name可以对访问客户端的域名进行限制。
精确匹配
通过指定明确的域名,来对域名进行限制,只有指定域名才能匹配到当前的虚拟主机。
server_name test.com www.test.com;
前置通配符匹配
server_name *.test.com;
后置通配符匹配
server_name www.test.*
正则表达式匹配
server_name ~^www\.(.+)\.com$;
默认服务器
默认服务器通过在listen配置的末尾添加default_server实现,当所有服务器都匹配失败时,则会由默认服务器处理。
listen 80 default_server;
从上至下优先级以此递减,当相同类型的匹配都匹配成功时,会选择固定部分最多的那个服务器,比如前置通配符匹配,*.test.com和*.com都匹配到www.test.com时,*.test.com服务器生效。
localtion
匹配URI
location配置URI匹配大致有五种方式,如下:
1. 精确匹配
通过 localtion = URI 来实现对URI的精确匹配。精确匹配下,URI必须相同,并且这种方式的优先级最高,优先进行匹配。
location = /test {
# 精确匹配 /
}
2. 前缀通配符
通过 location ^~ /test 方式,可以匹配以/test开头的URI,匹配优先级第二。
location ^~ /test {
# 直接匹配以 /test 开头的 URI
}
3. 正则表达式匹配
可以通过正则表达式,以location ~ \.test$的形式来匹配以.test结尾的URI,~*为不区分大小写。匹配优先级第三。
location ~ \.test$ {
# 匹配所有以 .test 结尾的 URI,区分大小写
}
location ~* \.TeSt$ {
# 匹配所有以 .test 结尾的 URI,不区分大小写
}
4. 前缀匹配
通过location /test,中间不加任何修饰符,代表怕匹配所有以/test开头的URI,虽然和前缀通配符匹配功能相同,不过前缀匹配优先级低于正则表达式,可以看实际情况选择使用。匹配优先级第四。
location /test {
# 匹配 /test 开头的路径
5. 通用匹配
location /匹配所有,优先级最低。
精确匹配
upstream
nginx作为反向代理服务器,提供了多种负载均衡的策略,可以通过在http模块配置下的upsteam配置项,配置所有服务地址的列表,然后在location内部通过porxy_pass配置这个服务器列表来开启负载均衡,其中默认为轮询。
轮询
沦胥为默认的负载均衡策略,无需配置。
权重
权重通过在upsteam中配置的地址列表后面,通过weight=n来给对应服务设置权重,nginx就会根据内置的权重算法进行负载均衡。
upstream myapp {
server ip1:port weight=3;
server ip2:port weight=2;
server ip3:port weight=1;
}
最少连接
选择连接数最少的服务进行负载均衡,可以防止某些连接时间过长导致服务器压力过大。可以通过在upsteam下添加least_conn开启。
upstream myapp {
least_conn;
server ip1;port;
server ip1;port;
server ip1;port;
}
IP哈希
通过IP哈,可以保证一个ip固定被分配相同的服务器,可以用需要保持会话的需求。通过在upsteam下添加ip_hash开启;
upstream myapp {
ip_hash;
server ip1;port;
server ip1;port;
server ip1;port;
}
upsteam还可以在服务地址后面添加down代表服务不可用,以及添加backup代表服务为备用服务,其他服务都不可用时才开启。
除此之外,还有大量的模块配置,没有办法一一全部说明,可以在实际生产中用到哪个,搜索哪个。