Linux之Nginx配置篇
一、Ngixn核心重点
-
Nginx是一款功能强大HTTP和反向代理服务器,目前大部分公司用于使用其Web服务器
- 在Nginx还未出世之前都是在使用比较传统Apache服务器,两则都能处理Web请求,但是后者处理效率更高、包括其负载均衡,反向代理功能都很强,硬件资源占有率很少,并呢个更好的和后端服务进行对接
- 模块化组件多种多样,它有很多模块组成---HTTP模块、EVENT模块,PROXY,Fstcgi,upstream等多个模块构成,并且模块又由多个功能组成:Handlers,Filters,Proxies
- 工作原理主程要依据master进分配任务给worker进程,然后我们client端访问就是被分配的各个worker进程,在企业高并发情况下,Nginx采用的是epoll模型,属于异步非阻塞,依据事件响应完成,传统Apache依据select遍历所有句柄完成
- Ngixn资源定位的关键依赖于Location,一般都是由location分发不同的模块来完成相应的工作
- worker内部分配流程,Nginx默认监听端口80由Master管理,然后我会有多个woker工人来抢分发下来的task,当抢到这个事件时我会将这件事务进行锁定,而其他工人无法接这个任务,最后完成请求转发,数据读取等操作
二、Nginx实战剖析
服务管理篇
2.1.1Nginx安装配置
具体详细安装步骤可以参考一下我的博客哦:Linux之Nginx安装及配置原理篇(一)-CSDN博客
这里主要阐述一下安装时注意要点:
# 在配置方面具体要注意以下几个方面# 1.首先需要主要的是Nginx需要用awk进行替换避免遇到一些不同机型版本兼容问题(这里以Nginx1.26.1版本为例)sed -i -e 's/1.26.1//g' -e 's/nginx\//JWS/g' -e 's/"NGINX"/"JWS"/g' src/core/nginx.h# 2.预编译阶段注意模块组件(gzip,ssl)
useradd -r -s /sbin/nologin www && ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module
2.1.2Nginx版本升级管理
以下介绍了一些详细的升级运维相关命令:
# 查看nginx运行状况
ps -ef | grep nginx#重启Nginx服务
nginx -s reload or kill -HUP 'path://nginx.pid'#检查配置
path://nginx -t#停止服务
nginx -s stop or pkill nginx#查看版本信息
nginx -V#替换就旧版本的Nginx备份旧版本的nginx可执行文件,复制新版本的nginx这行文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/
服务优化篇
2.2.1 配置文件常见优化
-
(一)配置文件
配置文件存放路径:/usr/local/nginx/conf/nginx.conf
首先介绍几个常见的服务配置
a.下面是针对events文件的详解,主要牵涉到了两个文件分别最大连接数和worker多任务调度的启动
events{worker_connections 1024; #worker进程处理最大连接数multi-accept on; 允许worker进程一次处理多个连接}
b.http虚拟服务器配置
参数 | sendfile | keepalive_timeout | gzip | include |
解释 | 启用高效文件传输 | 保持连续超时时间 | 启用压缩 | 包含其他配置文件 |
在此模块内部,通常会定义一个server模块,里面会让你添加服务的相关配置,例如:server_name,listen,root记录网站跟目录,index记录了其索引文件
这里listen监听端口即就是与http虚拟服务器进行socke连接
server_name用于指定主机名
server {listen 80;server_name localhost;
}
在server虚拟主机中还会牵涉到一个重要概念------location配置
关于location的URL匹配规则主要涉及到了三种方式 (精确匹配=、前缀匹配^~,正则匹配~或~*)
这里root即指定了文件系统路径,index代表着网页查找索引,try_file 表示顺序查找文件,expires设置了缓存时间
location / {root html;index index.htm index.html;try_fiiles on;expires: 3d;}
以下对于配置针对于后缀文件为mine.type文件实现了自动跳转至静态文件操作
修改完配置文件后要及时让nginx服务重置
#关闭防火墙
systemctl disable firewalld.service
systemctl restart firewalld# 重置Nginx服务
nginx -s reload# 查询worker进程分布情况
ps -eo,psr,pid,args | grep nginx #监控cpu利用率
top -p $(pgrep -d','nginx)将域名加入windows中hosts目录中
值得注意的是pid:代表nginx主进程id,include包含其他配置文件
-
(二)服务优化
tips:当配置多个server时,端口号是否不同主要取决于其监听方式
虚拟主机配置
>>>>方法一:基于域名实现
server {listen 88;server_name www.abc.com;location / {root html/tt1;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location /50x.html {root html;}}server{listen 88;server_name www.666.com;location / {root html/666/;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location /50x.html {root html;}
}
访问效果如下:
>>>方法二 含有多个IP时
server {listen 192.168.1.100:88;listen 192.168.1.200:88;}
不同域名和不同ip必须使用不同端口
server {listen 80;
}server {listen 8080;
}
【注意】在(同一IP/域名条件下)广泛运用Web服务和后台管理平台上
默认配置与location
当server监听到相同的端口,但没有找到与匹配虚拟服务是默认跳转到加入了default-server配置项的虚拟主机
server {listen 80 default-server
}
Location作为Nginx资源规则制定者,用于匹配符合要求URI
其语法格式为: location [修饰符] 匹配模式{}
几种常见的分类模式如下:
资源规则 | 前缀匹配 | 精确匹配 | 正则匹配(区分大小写) | 正则匹配(不区分大小写) | 有限前缀匹配 |
语法结构 | location = /prefix/ { #匹配以prefix/开头的URI } | location /exact { #只匹配/exact这个uri } | location ~ \.php${ 匹配以.php结尾的文件 } | location ~* \.(jpg|jpeg|png|gif)${ #匹配图片扩展名文件,不区分大小写 } | location ^~/images/{ #以/images/开头的uri } |
【案例】将我桌面上的图片匹配显示至浏览器窗口,需要加入以下配置
location ~* \.(jpg|jpeg|png|gif)$ {root html/;expires 3d;access_log off;}
效果如下:
其优先级如下:
精准匹配>有限前缀匹配>正则匹配>前缀匹配
2.2.2 负载均衡
负载均衡就是将网络流量交给多台服务器来处理,从而优化资源使用,提高吞吐量,减少访问时间,解决了单一资源负载问题
用生活上的例子可以根据服务员接待客户的例子来说,在工作量上来看负载均衡工作效率很高,让任务分配的更加均衡了
配置修改部分
通过测试发现效果有效三个网页均能在不同端口中打开
### 负载均衡部分upstream myapp{server 127.0.0.1:8001 weight=2;server 127.0.0.1:8002;server 127.0.0.1:8003;}server{listen 88;server_name www.abc.com;location / {root html/tt1/;index index.html index.htm;proxy_pass http://myapp;proxy_set_header Host $host;}location ~* \.(jpg|jpeg|png|gif)$ {root html/;expires 3d;access_log off;}}
负载均衡效果如图所示:
注意:关于Nginx服务中查看命令有以下几个部分需要值得注意
1.端口查询命令:netstat -tulnp | grep -E '8001|8002|8003'
2.查看端口使用情况:lsof -i:[port]
3.强制关掉进程:kill -9 [pid]
2.2.3 动静态资源跳转
- 动态APi将请求代理到外部服务(实际IP地址就是10.2.53.5:8001)
- 设置try_files配置,如果没有代理服务器转发,将返回404
- $remote_addr:将客户端真实IP传递给后端
具体配置代码详细如下:
### 静态资源处理location = / {root /usr/local/nginx/html;try_files $uri /index.html =404
}### 动态代理处理服务
location /api/ {proxy_pass http://10.2.53.5:8001/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
}location / {proxy_pass http://myapp;proxy_set_header Host $host;proxy_set_header X-REAL-IP $remote_addr; ##后端应用能够获得客户端真实IP
}