Nginx 服务
Nginx简介
1、Nginx介绍
Nginx (”engine x“)一个具有高性能的“HTTP”和“反向代理”的WEB服务,同时也是一个“POP3/SMTP/IMAP代理服务“,是由伊戈尔·赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一提的是伊戈尔·赛索耶夫将Nginx的源码进行了开源,这也为Nginx的发展提供了良好的保障。
2、Nginx功能分类
Nginx提供的服务功能从大体上归纳为”基本HTTP服务“、”高级HTTP服务“和”邮件服务“等三大类。
2.1 基本HTTP服务
Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。
- 处理静态文件、处理索引文件以及支持自动索引;
- 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载均衡和容错;
- 提供对FastCGl、memcached等服务的缓存机制;
- 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放等;
- 支持HTTP下的安全套接层安全协议SSL;
- 支持基于加权和依赖的优先权的HTTP/2。
2.2 高级HTTP服务
- 支持基于名字和IP的虚拟主机设置;
- 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接;
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转;
- 提供3xx~5xx错误代码重定向功能;
- 支持重写(Rewrite)模块扩展;
- 支持重新加载配置以及在线升级时无需中断正在处理的请求;
- 支持网络监控;
- 支持FLV和MP4流媒体传输。
2.3 邮件代理服务
Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下特性:
- 支持IMPA/POP3代理服务功能
- 支持内部SMTP代理服务功能
3、Nginx特点
-
速度更快、并发更高
单次请求或者高并发请求的环境下,Nginx都会比其他Web服务响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。
-
配置简单,扩展性强
Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。
-
高可靠性
Nginx采用的是多进程模式运行,其 中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。
-
热部署
现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。
-
成本低、BSD许可证
BSD是一个开源的许可证;Nginx本身是开源的,我们不仅可以免费的将Nginx应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。这些点也都是Nginx为什么能吸引无数开发者继续为Nginx来贡献自己的智慧和青春。
4、Nginx和Apache对比
nginx相对于apache的优点:
-
轻量级,同样起web 服务,比apache占用更少的资源;
-
抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;
-
高度模块化的设计,编写模块相对简单。
apache 相对于nginx 的优点:
-
rewrite功能比nginx的rewrite 强大;
-
模块超多,基本想到的都可以找到;
-
超稳定,nginx相对apache来说bug较多。
Nginx与Apache使用场景:
- 追求性能web服务用nginx,nginx占用资源少,并发高,静态资源处理性能比apache强;如果不需要性能只求稳定选择apache;
- apache模块更多,各种功能模块实现比nginx更好、配置项更多,但apache配置起来更复杂;追求功能模块使用apache,想要配置简单使用nginx;
- nginx处理动态请求较差,一般动态请求要apache去做,nginx更适合静态和反向代理;
- nginx本身就是一个反向代理服务器,nginx支持7层负载均衡。
5、Nginx安装部署
5.1 yum/dnf部署
yum -y install epel-release
yum makecache
yum -y install nginx
5.2 源码编译部署
yum -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
useradd -s /sbin/nologin -M nginx
mkdir -p /data
tar -xf nginx-1.20.2.tar.gz
cd nginx-1.20.2/
./configure --prefix=/data/nginx --user=nginx --group=nginx --http-client-body-temp-path=/data/nginx/tmp/client/ --http-proxy-temp-path=/data/nginx/tmp/proxy/ --http-fastcgi-temp-path=/data/nginx/tmp/fcgi/ --http-uwsgi-temp-path=/data/nginx/tmp/uwsgi --http-scgi-temp-path=/data/nginx/tmp/scgi --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-pcre --with-compat
make && make install
mkdir -p /data/nginx/tmp/client
echo 'export PATH=$PATH:/data/nginx/sbin' > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh
#配置systemd启动
chown -R nginx.nginx /data/nginx/
cat > /usr/lib/systemd/system/nginx.service << 'EOF'
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/data/nginx/logs/nginx.pid
ExecStartPre=/data/nginx/sbin/nginx -t
ExecStart=/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
ExecReload=/data/nginx/sbin/nginx -s reload
ExecStop=/data/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable nginx --now
6、Nginx配置详解
nginx的配置文件是整个服务器的核心所在,它不仅规定了nginx如何响应请求、处理数据,还决定了服务器的各种高级功能如何运作。通过修改配置,我们可以轻松实现诸如反向代理、负载均衡、静态资源服务等功能,从而提升服务器的性能和可靠性;nginx主配置文件为nginx.conf,一般位于nginx安装目录下的conf目录中。
6.1 配置文件结构
nginx配置文件由三个主要部分组成:全局块、events块和http块。其中http块还包含了http全局块和多个server块。每个server块中又进一步包含了server全局块以及多个location块。
- 全局块涵盖了配置文件开头的部分,主要涉及worker_processes指令,它用于指定Nginx的工作进程数,通常设置为与服务器CPU核数相等。
- events块中,worker_connections指令至关重要,它定义了Nginx服务器可同时处理的网络连接数。该数值的计算方式为worker_processes乘以worker_connections,例如,当worker_processes=4且worker_connections=1024时,服务器最多可支持4096个并发连接。
- http块则是Nginx服务器配置中的核心部分,负责配置诸如反向代理、负载均衡和动静分离等关键功能。
- server块用于设置虚拟主机,支持基于IP、端口号和域名三种方式的配置。
- location块在Nginx的整个配置文档中扮演着至关重要的角色,许多功能的实现都需要在此进行详尽的配置。
#全局块
user nginx;
worker_processes auto;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
#events块
events {
use epoll;
worker_connections 10240;
}
#http块
http {
#http全局块
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
#server块
server {
#server全局块
listen 80;
server_name localhost;
access_log logs/host.access.log main;
error_log logs/host.error.log;
#location块
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#location块
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#location块
location ~ /\.ht {
deny all;
}
}
#server块
server {
#server全局块
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#location块
location / {
root html;
index index.html index.htm;
}
}
}
6.2 配置文件解释
user nginx; #nginx使用哪个用户运行
worker_processes auto; #指定Nginx的工作进程数,通常设置为与服务器CPU核数相等
error_log logs/error.log; #nginx错误日志存放路径,相对与nginx安装目录的路径
#error_log logs/error.log notice; #指定错误日志存放路径的同时指定日志级别,notice表示通知类日志也会记录,info表示普通的信息日志也会记录,默认是error只记录错误日志
#error_log logs/error.log info;
pid logs/nginx.pid; #nginx进程id存放路径,相对与nginx安装目录的路径
#events块
events {
use epoll; #采用epoll事件驱动模型
worker_connections 10240; #设置每个工作进程同时连接的最大数量
}
#http块
http {
#http全局块
include mime.types; #引入mime.types配置,表示nginx能识别的各种文件的类型,如mp4、jpg等,未识别的文件默认会进行下载
default_type application/octet-stream; #文件类型未,则以八进制文件流的方式处理
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义日志格式
access_log logs/access.log main; #访问日志存放路径及格式配置
sendfile on; #高效的文件传输方式
tcp_nopush on; #和sendfile搭配使用数据包累计一定大小后发送
keepalive_timeout 65; #tcp超时时间
#server块
server {
#server全局块
listen 80; #监听的主机端口
server_name localhost; #监听的域名
access_log logs/host.access.log main; #访问日志存放路径及格式
error_log logs/host.error.log; #错误日志存放路径
#location块
location / { #location匹配规则
root html; #站点路径,html为默认nginx站点
index index.html index.htm; #站点默认主页文件
}
error_page 404 /404.html; #404错误页面
error_page 500 502 503 504 /50x.html; #50x错误页面
location = /50x.html { #50x页面location配置
root html;
}
#location块
location ~ \.php$ { #localtion匹配规则正则匹配
root html;
fastcgi_pass 127.0.0.1:9000; #动态服务地址,动态请求转发至后端动态服务
fastcgi_index index.php; #动态站点默认主页文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #传递至后端的环境变量
include fastcgi_params; #引入默认环境变量
}
#location块
location ~ /\.ht { #localtion匹配规则正则匹配
deny all; #拒绝所有符合该匹配的请求
}
}
#server块
server {
#server全局块
listen 443 ssl; #监听的主机端口,采用ssl加密
server_name localhost;
ssl_certificate cert.pem; #证书路径
ssl_certificate_key cert.key; #私钥路径
ssl_session_cache shared:SSL:1m; #缓存配置
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#location块
location / {
root html;
index index.html index.htm;
}
}
include ../sites-enabled/*.conf; #加载其他配置文件,在http块中使用可以将不同的server写入不同配置文件统一加载,避免配置文件过于繁琐
}
6.3 站点配置示例
#编辑主配置文件
user nginx;
worker_processes auto;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
access_log logs/host.access.log main;
error_log logs/host.error.log;
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
#进入站点目录添加主页文件
cd /data/nginx/html
cat > index.html << 'EOF'
hello world
EOF
#启动服务
systemctl start nginx
#重载配置,nginx不需要重启加载配置,一般先检查配置,然后热重载配置
nginx -t
nginx -s reload
#测试,命令行使用curl请求web服务,返回hello world主页内容
curl http://127.0.0.1:80
hello world
7、多站点配置
nginx和httpd一样也可以用虚拟主机的方式配置不同站点。
多站点配置方式:
- 相同IP不同端口
- 不同IP相同端口
- 相同IP相同端口不同域名
相同IP相同端口不同域名
#单独编辑新的配置文件,配置多站点
mkdir /data/nginx/sites-enabled/
vim /data/nginx/sites-enabled/test.conf
server {
listen 192.168.1.1:80;
server_name www.hzz.com;
location / {
root /data/nginx/html/hzz;
index index.html index.htm;
}
}
server {
listen 192.168.1.1:80;
server_name www.zzh.com;
location / {
root /data/nginx/html/zzh;
index index.html index.htm;
}
}
#配置站点
mkdir /data/nginx/html/hzz
cat > /data/nginx/html/hzz/index.html << 'EOF'
hzz
EOF
mkdir /data/nginx/html/zzh
cat > /data/nginx/html/zzh/index.html << 'EOF'
zzh
EOF
#重载配置
nginx -t
nginx -s reload
#测试,注意配置域名解析
curl http://www.hzz.com
hzz
curl http://www.zzh.com
zzh
8、https站点配置
nginx配置https需要安装时添加https模块,yum/dnf安装默认支持https,编译安装在编译时需要加入–with-http_ssl_module。
配置示例
#生成自签证书文件
#生成完成后包括server.key,server.csr,server.crt文件,实际仅需要server.key,server.crt即可
mkdir /data/nginx/cert
cd /data/nginx/cert
openssl genrsa -out server.key 2048
#信息填写回车即可
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
vim /data/nginx/sites-enabled/test-https.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /data/nginx/cert/server.crt; #配置证书路径
ssl_certificate_key /data/nginx/cert/server.key; #配置私钥路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
#测试,此时请求web服务应使用https协议
curl https://127.0.0.1:443
hello world