一、Nginx概述
1、什么是nginx?
- 稳定性高、系统资源消耗低、
- 对HTTP并发连接的处理能力高(单台物理器可支持30000-50000个并发请求)
NG并发连接能力有2个因素的影响
①CPU的个数
②本地吴立琪系统的最大文件打开数
2、Nginx应用场景
静态服务器(图片、视频服务)
动态服务
反向代理,负载均衡
缓存服务
反向代理解释: 是指用户不需要知道目标服务器的地址,也不需要再用户端做任何设定,可以直接通过访问反向代理服务器来获得目标服务器的资源,反向代理提高了内部服务器的安全,加快了对内部服务器的访问速度。
反向代理的优点:
①提高了内部服务器的安全
②加快了读i内部服务器的访问速度
③节约了有限的IP资源
3、Nginx应用企业
因为nginx的特定是内有内存少,并发能力强。
国内使用nginx网站用户有: 百度,BWS,新浪,网易,腾讯等
但是 淘宝 再GPL的原则上进行二次开发,出现了现在的 Tengine网站
4、nginx的HTTPD七层代理和四层代理
nginx的http七层代理,nginx工作在OSI七层模型的应用曾,由于其可以解析http协议,我们可以根据URL进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗,为了能获取更高的代理性能,
nginx支持了四层代理,即传输层,就是TCO/UDP层,没有协议解析,就是简单的TCP/UDP转发,代理性能突飞猛进 (版本在1.18之上才支持)
二、Nginx和Apache的区别
Nginx是一个基于事件的Web服务器,Apache是一个基于流程的服务器。
Nginx所有请求都是由一个线程处理,Apache单个线程处理单个请求。
Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方便一般。
Nginx的性能和伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件。
Nginx支持热部署,Apache不支持热部署。
Nginx对于静态文件处理具有高效率,Apache相对一般。
Nginx在反向代理场景具有明显优势,Apache相对一般。
三、编译安装Nginx服务
1、关闭防火墙,将软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2、安装依赖包
nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
4、检查是否存在依赖环境,生成makefile文件
注意:configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。生成这个文件之后,才可以进行make编译。
cd /opt
tar zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
5、编译和安装
使用./configure进行检查之后,生成这个makefile文件,才可以进行make编译,不然会报错
make && make install
6、添加nginx命令到环境变量中
让系统识别nginx的操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
7、检查、启动、重启、停止nginx服务
了解kill的命令选项
信好编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化 |
2 | INT | 表示结束进程,但并不是强制性的,常用的“ctrl +c”组合键就是这个信号 |
3 | QUIT | 退出 |
9 | KILL | 杀死进程,强制结束进程 |
11 | SEGV | 段错误 |
15 | TERM | 正常结束进程,是kill命令的默认信号 |
查看配置文件是否配置正确
nginx -t
#启动nginx服务
nginx
#停止nginx服务
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的pid号
kill -3 【pid号】
8、添加Nginx系统服务
8.1 方法一:使用脚本进行
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
#description:Nginx Service Control Script //这也是必须的
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
8.2 方法二:使用配置文件进行
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定
PIDFile以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
编辑好脚本后,然后设置权限为754
chmod 754 /lib/systemd/system/nginx.service
8、网页访问ip地址查看
四、升级nginx服务(1.12.2 —>1.22.0)
1、官网搜索下载稳定版的最新版本
网址:[nginx: download](https://nginx.org/en/download.html)
2、将新版本拷贝到/opt目录下,然后解压
rz 选中桌面文件进行上传,或直接拉到shell中即可
tar -zxf nginx-1.22.0.tar.gz #解压
cd nginx-1.22.0 #进入解压后的目录
nginx -v #查看当前版本
3、关闭nginx服务(可以不关)
cat /usr/local/nginx/logs/nginx.pid #查看进程号
kill -3 【pid】 #退出进程
4、安装依赖包
依赖包必须要安装,不然使用./configure 进行检查时,发现没有依赖包,导致make编译不成功
yum -y install gcc openssl openssl-devel pcre-devel zlib zlib-devel
5、检查安装平台的目标特征
cd /nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
6、进行编译
make #只需要进行编译,不能安装,不然覆盖了之前的版本
7、备份老版本的nginx
将可执行命令程序进行修改名称
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
复制新版本的命令程序到安装的目录
cp objs/nginx /usr/local/nginx/sbin/nginx
8、重启服务,查看版本
nginx #启动服务
nginx -v #查看版本
9、验证
五、认识Nginx服务的主配置文件
配置文件路径:/uar/local/nginx/conf/nginx.conf
1、全局配置
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
2、I/O 事件配置
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接
}
#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
3、HTTP 配置
当httpd被请求的时候,才会被触发执行这里面的配置。
使用“http { }”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保
持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包
含在子界定标记“server { }”内
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;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server {
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.kgc.com;
##网页的默认字符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/local/nginx/html
root html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
}
3.1 Web服务的监听配置
3.2 日志格式设定
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
location常见配置指令,root、alias、proxy_pass
root(根路径配置):root /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/test/1.html
alias(别名配置):alias /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.html
proxy_pass(反向代理配置)
Nginx网站服务
一款高性能、轻量级Web服务软件
稳定性高
系统资源消耗低
对HTTP并发连接的处理能力高,单台物理服务器可支持30000~50000个并发请求。
(实际操作之中,很多公司为了服务器的稳定,都会设置在20000个左右)
Nginx功能介绍
Nginx 是一款高性能的开源 Web 服务器和反向代理服务器,它具有以下主要功能:
静态文件服务:Nginx 可以直接提供静态文件的服务,例如 HTML、CSS、JavaScript、图像等。
它能够高效地处理并响应静态文件的请求。
反向代理:Nginx 可以作为反向代理服务器,将客户端的请求转发给后端的多个服务器。
它可以实现负载均衡、高可用性和故障转移,提供更好的性能和可靠性。
动态内容处理:Nginx可以与后端应用服务器(如 PHP-FPM、Node.js、Java 应用服务器等)配合使用,
实现动态内容的处理和执行。它可以代理动态请求,并将请求的结果返回给客户端。
SSL/TLS 加密支持:Nginx 支持通过 SSL/TLS 对客户端和服务器之间的通信进行加密,
提供安全的 HTTPS 连接。
虚拟主机支持:Nginx 支持配置多个虚拟主机,使得可以在同一台服务器上托管多个域名或站点。
每个虚拟主机可以拥有独立的配置和资源。
URL 重写和重定向:Nginx 支持灵活的 URL 重写和重定向规则,可以对请求的 URL 进行修改和重定向,
实现 URL 的美化和重定向策略。
缓存机制:Nginx 提供了强大的缓存功能,可以缓存静态文件和动态内容,
以减轻后端服务器的负载并提供更快的响应速度。
日志记录:Nginx 能够记录访问日志和错误日志,可以记录请求的详细信息,包括访问时间、请求路径、
IP、响应状态等,帮助进行故障排查和性能分析。
可扩展性和灵活性:Nginx 的模块化架构和强大的配置选项使得它具有很高的可扩展性和灵活性。
你可以通过加载不同的模块和自定义配置来满足特定的需求。
Tengine:
Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添
加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网、天猫商城等得到了很好
的检验。(可以这样理解:淘宝网拿到了 Nginx 源代码之后,进行了功能的填充、优化等等,然后提交给
Nginx 官方,但是由于 Nginx 官方相应慢甚至不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打
包,出了现在的 Tengine 这个版本)
基础特性
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
Web服务相关的功能
虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
nginx 应用场景
静态服务器 (图片、视频服务、文本)
动态服务
反向代理,负载均衡
缓存服务
Apache与Nginx的区别
Nginx Apache
nginx是一个基于事件的web服务器 apache是一个基于流程的服务器
所有请求都由一个线程处理 单个线程处理单个请求
nginx避免子进程的概念 apache是基于子进程的
nginx类似于速度 apache类似于功率
nginx在内存消耗和连接方面比较好 apache在内存消耗和连接上没有提高
nginx在负载均衡方面表现较好 当流量到达进程极限时,apache将拒绝新的连接。
nginx不支持IBMI和openvms一样的os apache支持更多的os
nginx只具有核心功能 apache提供了比nginx更多的功能
nginx的性能和可伸缩性不依赖于硬件 apache依赖于cpu和内存等硬件组件
Nginx支持热部署 Apache不支持热部署
热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用
Nginx对比Apache的优势:
轻量级,nginx比apache 占用更少的内存及资源;
静态处理,Nginx 静态处理性能比 Apache 高 ;
Nginx可以实现无缓存的反向代理加速,提高网站运行速度;
Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件;
Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级;
nginx是异步进程,多个连接可以对应一个进程 ;apache是同步多进程,一个连接对应一个进程;
Nginx高度模块化,编写模块相对简单,且组件比Apache少
高并发下nginx 能保持低资源低消耗高性能;
Nginx 配置简洁, Apache配置复杂;
apache相对于nginx的优点 :
Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
模块多,基本想到的都可以找到
少bug, nginx的bug相对较多
超稳定
Nginx处理动态请求是弱项,动态请求要Apache去做。
经典问题1:Nginx 是如何实现高并发的?
异步,非阻塞,使用了epoll和大量的底层代码优化。
如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。
正常情况下,会有很多进程一直在等待中。
而nginx采用一个master进程,多个woker进程的模式。
master进程主要负责收集、分发请求。
每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。
同时master进程也负责监控woker的状态,保证高可靠性woker进程一般设置为跟cpu核心数一致。
nginx的woker进程在同一时间可以处理的请求数只受内存限制,可以处理多个请求。
Nginx的异步非阻塞工作方式正把当中的等待时间利用起来了。
在需要等待的时候,这些进程就空闲出来待命了,因此表现为少数几个进程就解决了大量的并发问题。
同步,异步,阻塞,非阻塞的概念补充
同步和异步
同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,
这是一种可靠的服务序列。
要么成功都成功,失败都失败,服务的状态可以保持一致
异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,
此时该服务就算完成了。被依赖的服务是否最终完成无法确定,因此它是一个不可靠的服务序列。
阻塞与非阻塞
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,
函数只有在得到结果之后才会返回。
非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
面试题:
Nginx为什么不使用多线程?
Apache: 创建多个进程或线程,
而每个进程或线程都会为其分配 cpu 和内存
(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会耗光服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),
不会为每个请求分配cpu和内存资源,节省了大量资源,
同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2、安装依赖包
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
3、创建运行用户、组
(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
4、编译安装Nginx
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/
cd nginx-1.22.0/
./configure --prefix=/usr/local/nginx \
--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
--prefix=/usr/local/nginx 指定了Nginx的安装目录。在这种情况下,它将安装在 /usr/local/nginx 目录下。
--user=nginx 和 --group=nginx 指定了运行Nginx进程的用户和组。在这种情况下,它将是用户和组 nginx。
--with-http_ssl_module 启用了对HTTP连接的SSL/TLS加密支持。
--with-http_v2_module 启用了对HTTP2.0协议的支持。
--with-http_realip_module 允许Nginx从X-Real-IP或X-Forwarded-For头部获取客户端的真实IP地址。
--with-http_stub_status_module 启用了 stub_status 模块,提供了访问Nginx状态信息的方法。
--with-http_gzip_static_module 启用了支持使用 .gz 扩展名提供预压缩文件的功能。
--with-pcre 启用了对Perl Compatible Regular Expressions(PCRE)库的支持。
--with-stream 启用了对TCP/UDP代理模块的支持。
--with-stream_ssl_module 启用了对TCP/UDP连接的SSL/TLS加密支持。
--with-stream_realip_module 允许Nginx从PROXY协议头部获取客户端的真实IP地址。
make && make install
chown -R nginx.nginx /usr/local/nginx #修改权限
[root@localhost nginx]# ll /usr/local/nginx/
总用量 4
drwxr-xr-x. 2 nginx nginx 4096 4月 11 16:18 conf
drwxr-xr-x. 2 nginx nginx 40 4月 11 16:18 html
drwxr-xr-x. 2 nginx nginx 6 4月 11 16:18 logs
drwxr-xr-x. 2 nginx nginx 19 4月 11 16:18 sbin
安装好后生成四个文件功能如下
1. conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,
其他的.conf则是用来配置nginx相关的功能的.
例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,
配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
2. html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,
另外还有一个50x的web文件是默认的错误页面提示页面。
3. logs:用来保存nginx服务器的访问日志错误日志等日志,
logs目录可以放在其他路径,比如/var/logs/nginx里面。
4. sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ #让系统识别nginx的操作命令
nginx -t——————————检查配置文件是否配置正确
nginx——————————————启动
[root@localhost opt]# killall nginx #停止
停止
cat /usr/local/nginx/logs/nginx.pid——————————查看nginx的PID号
kill -3 <PID号>
kill -s QUIT <PID号>
killall -3 nginx
killall -s QUIT nginx
重载
kill -1 <PID号>
kill -s HUP <PID号> #这里要注意,使用killall,可以用服务名和PID号,但是只有kill只能用pid
killall -1 nginx
killall -s HUP nginx
日志分隔,重新打开日志文件
kill -USR1 <PID号>
平滑升级
kill -USR2 <PID号>
添加Nginx系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
[Unit] 部分描述了单元的用途,以及文档的位置。
它还规定了在 Nginx 启动前需要启动的服务的依赖关系和顺序。
[Service] 部分包含了 Nginx 服务的配置,包括服务类型(在这种情况下是 forking)、PID 文件的位置
以及启动、重新加载和停止服务的命令。
最后,[Install] 部分指定了服务安装的目标。
ExecReload=/bin/kill -s HUP $MAINPID #相当与restart
ExecStop=/bin/kill -s TERM $MAINPID #相当与stop
mkdir -p /usr/local/nginx/run/
#创建目录
cp nginx.conf nginx.conf.bak.2023.08.04
#进行备份
vim /usr/local/nginx/conf/nginx.conf
#修改配置文件
pid /usr/local/nginx/run/nginx.pid;
#找到 pid的位置修改
systemctl daemon-reload
#重新加载配置
systemctl enable --now nginx
#开机自启并立即启动 如果卡主是应为logs下有 nginx.pid 文件 删除即可
chown -R nginx.nginx /usr/local/nginx
systemctl start nginx.service
systemctl enable nginx.service
###信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用有以下选项
[root@node2 ~]#nginx -h
-v:显示 Nginx 版本并退出。
-V:显示 Nginx 版本和配置选项,然后退出。
-t:测试配置文件并退出。
-T:测试配置文件并将其转储到控制台(标准输出),然后退出。
-q:在测试配置文件时禁止显示非错误消息。
-s signal:向主进程发送信号(停止、退出、重新打开、重新加载)。
-p prefix:设置 Nginx 的前缀路径(默认为 /etc/nginx/)。
-e filename:设置错误日志文件的路径(默认为 /var/log/nginx/error.log)。
-c filename:设置配置文件的路径(默认为 /etc/nginx/nginx.conf)。
-g directives:在不修改配置文件的情况下设置全局指令。
可以使用man手册来查看详细的信号 如果没安装,去源码包里找到man文件
man 路径/nginx.8 不加路径打不开man帮助
stop SIGTERM 直接停止
quit SIGQUIT 优雅的退出:有人在访问不会结束进程
reopen SIGUSR1 分割日志
reload SIGHUP 重新加载配置文件
SIGHUP Reload configuration, start the new worker process with a new configuration, and
gracefully shut down old worker processes.
SIGQUIT Shut down gracefully. 优雅的关闭:有人在访问不会结束进程
SIGUSR1 Reopen log files. 重新分割日志
SIGUSR2 Upgrade the nginx executable on the fly. 运行中升级
SIGWINCH Shut down worker processes gracefully. 优雅的关闭worker进程,work进程负责处理请求,还有请求不会关闭
nginx -s stop #立即关闭nginx
nginx -s reload #重新加载
-s 参数只能用来发送信号给Nginx主进程,不能开启nginx服务
yum安装方式
centos7 需要安装epel源
yum install -y epel-release
安装epel源
yum install nginx -y
三、Nginx服务的主配置文件nginx.conf
#user nobody; #运行用户,若编译时未指定则默认为nobody
worker_processes 1; #工作进程数量,可配置成服务器内核数*2,如果网站访问量不大,一般设为1就够用了
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID文件的位置
events {
use epoll; #使用epoll模型, 2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 1024; #每个进程处理1024个连接
}
#如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)
#可使用"ulimit -a"命令查看系统允许当前用户进程打开的文件数限制。
注意:设置保存后,需要重新ssh连接才会看到配置更改的变化
vim /etc/security/limits.conf
# 65535 为Linux系统最大打开文件数
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
reboot
全局配置的六个模块简介:
全局块:全局配置,对全局生效;
events块:配置影响 Nginx 服务器与用户的网络连接;
http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
location块:用于配置匹配的 uri ;
注意:location 匹配的内容来源是来自网页的URI,而不是URL
(URL代表整个链接如:www.baidu.com/images/search,而URI则是/images/search。
所以nginx的location匹配的是URI)
Nginx的四大模块——proxy、headers、upstream、stream模块
Proxy 模块:
proxy 模块是 Nginx 的核心模块之一,用于实现反向代理功能。
它允许将客户端的请求代理到后端的服务器,并将响应返回给客户端。
proxy 模块支持 HTTP、HTTPS、FastCGI、uWSGI、SCGI 等多种协议。
通过配置 proxy_pass 指令,可以指定代理的后端服务器地址。
Headers 模块:
headers 模块用于处理 HTTP 请求和响应的头部信息。它允许添加、修改或删除请求头和响应头,
实现对头部信息的定制化控制。headers 模块提供了一系列的指令,
如 add_header、set_header、more_set_headers 等,用于操作头部信息。
Upstream 模块:
upstream 模块用于配置反向代理服务器组(也称为上游服务器组)。
它定义了后端服务器的列表和相关的负载均衡策略,用于分发请求到后端服务器。
upstream 模块通过 upstream 块来配置后端服务器组,其中包括 server 指令用于定义后端服务器。
Stream 模块:
stream 模块是 Nginx 的流处理模块,用于处理 TCP 和 UDP 流量。
它提供了 TCP/UDP 代理、负载均衡、数据包过滤等功能。stream 模块通过 stream 块来配置流的处理规则,
可以根据目标地址和端口等条件进行流量的转发和处理。
HTTP配置
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type appkgcation/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;
#此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据) ,
此选项仅在使用sendfile的时候使用
#tcp_nopush on;
#连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip模块设置,设置是否开启gzip压缩输出
gzip on;
-------------------------------------------------------------------------------------------
日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,
通过$remote_add拿到的IP地址是反向代理服务器的iP地址。
反向代理服务器在转发请求的http头信息中,
可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
--------------------------------------------------------------------------------------------
# Web服务的监听配置
server {
#监听地址及端口
listen 80;
#站点域名,可以有多个,用空格隔开
server name www.kgc.com;
#网页的默认字符集
charset utf-8;
#根目录配置
location / {
网站根目录的位置/usr/local/nginx/html
root html;
#内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
#错误页面配置
location = /50x.html {
root html;
}
}
}
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.kgc.com;
systemctl restart nginx.service
echo "192.168.233.21 www.kgc.com" > /etc/hosts ---没有做正向解析,直接主机映射
访问浏览器
location常见配置指令,root、alias、proxy_pass(反向代理配置)
nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/",那么访问的url地址中这个path目录后面加不加"/"不影响访问,访问时它会自动加上"/";
但是如果location匹配的path目录后面加上"/",那么访问的url地址中这个path目录必须要加上"/",访问时它不会自动加上"/"。如果不加上"/",访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。
其他区别:
1、 alias 只能作用在location中,而root可以存在server、http和location中。
2、 alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无。
访问状态统计配置
1、先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
2、修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置##
location /status { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
}
}
systemctl restart nginx
http://192.168.233.21/status
Active connections: 1
server accepts handled requests
90 90 90
Reading: 0 Writing: 1 Waiting: 0
Active connections :表示当前的活动连接数;
server accepts handled requests:表示已经处理的连接信息,
三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。
基于授权的访问控制
1、生成用户密码认证文件
yum install -y httpd-tools ----httpasswd是工具,要先安装
htpasswd -c /usr/local/nginx/passwd.db zhangsan 创建一个用户,passwd.db存储用户信息
chown nginx /usr/local/nginx/passwd.db 只有root和nginx用户可以读
chmod 400 /usr/local/nginx/passwd.db
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加认证配置##
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
nginx -t
systemctl restart nginx
基于客户端的访问控制
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制规则##
deny 192.168.233.21; #拒绝访问的客户端 IP
allow all; #允许其它IP客户端访问
}
}
systemctl restart nginx
基于域名的 Nginx 虚拟主机
为虚拟主机提供域名解析
echo "192.168.233.21 www.kgc.com www.accp.com" >> /etc/hosts
为虚拟主机准备网页文档
mkdir -p /var/www/html/kgc
mkdir -p /var/www/html/accp
echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html
echo "<h1>www.accp.com</h1>" > /var/www/html/accp/index.html
修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name www.kgc.com; #设置域名www.kgc.com
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc; #设置www.kgc.com 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.accp.com; #设置域名www.accp.com
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
基于IP 的 Nginx 虚拟主机:
ifconfig ens33:0 192.168.233.100 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.233.21:80; #设置监听地址
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.233.33:80; #设置监听地址
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
systemctl restart nginx
基于端口的 Nginx 虚拟主机:
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.233.21:8080; #设置监听 8080 端口
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.233.21:8888; #设置监听 8888 端口
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
systemctl restart nginx
平滑升级:
1、把1.22.0拖进来后,编译安装
./configure --prefix=/usr/local/nginx \
--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
注意:安装的位置和上一个版本一致,第二,编译结束后make即可,不要用make install
2、在老版本目录下,把原来的执行文件改名字
[root@localhost sbin]# mv nginx nginx.bak
3、[root@localhost nginx-1.22.0]#cp objs/nginx /apps/nginx/sbin/
#将新版本 拷入进去
4、[root@localhost sbin]# kill -USR2 `cat /usr/local/nginx/run/nginx.pid`
#在老版本下,传递信号,平滑升级
[root@localhost sbin]# ps auxf|grep nginx
root 16386 0.0 0.0 112824 988 pts/3 S+ 14:35 0:00 \_ grep --color=auto ngin
root 5479 0.0 0.1 46368 2044 ? Ss 13:15 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 5489 0.0 0.1 48888 2092 ? S 13:16 0:00 \_ nginx: worker process
nginx 5490 0.0 0.1 48888 2080 ? S 13:16 0:00 \_ nginx: worker process
root 16382 0.0 0.1 46224 3364 ? S 14:35 0:00 \_ nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 16383 0.0 0.0 48760 1972 ? S 14:35 0:00 \_ nginx: worker process
nginx 16384 0.0 0.0 48760 1984 ? S 14:35 0:00 \_ nginx: worker process
5、[root@localhost run]# kill -WINCH `cat /usr/local/nginx/run/nginx.pid.oldbin`
[root@localhost run]# ps auxf|grep nginx
root 16490 0.0 0.0 112824 984 pts/3 S+ 14:43 0:00 \_ grep --color=auto ngin
root 5479 0.0 0.1 46368 2044 ? Ss 13:15 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
root 16382 0.0 0.1 46224 3364 ? S 14:35 0:00 \_ nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 16383 0.0 0.0 48760 1972 ? S 14:35 0:00 \_ nginx: worker process
nginx 16384 0.0 0.0 48760 1984 ? S 14:35 0:00 \_ nginx: worker process
优雅退出老的进程,升级结束;
回滚:
[root@localhost opt]# kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`
检查进程:
[root@localhost objs]# ps -ef | grep nginx
root 5479 1 0 13:15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
root 16382 5479 0 14:35 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 16383 16382 0 14:35 ? 00:00:00 nginx: worker process
nginx 16384 16382 0 14:35 ? 00:00:00 nginx: worker process
nginx 16728 5479 0 15:05 ? 00:00:00 nginx: worker process
nginx 16729 5479 0 15:05 ? 00:00:00 nginx: worker process
root 16740 13113 0 15:06 pts/2 00:00:00 grep --color=auto nginx
又是两个进程
[root@localhost objs]# kill -QUIT `cat /usr/local/nginx/run/nginx.pid`
通过向主进程发送退出信号来优雅地停止 Nginx Web 服务器。完成回滚