Nginx是一个高性能的HTTP和反向代理器,具有占内存少,并发能力强的特点。市面上关于Nginx的博客和书籍非常多,本文只是帮助读者快速上手Nginx,篇幅有限,很难做到面面俱到,望各位见谅。
名词解释
- CGI: 是 Web Server 与 Web Application 之间数据交换的一种协议(规定Nginx接收哪些数据,以什么样的数据格式传给应用程序(PHP、Python、JAVA等) 。每一次web请求CGI都会 fork 新的子进程,处理完毕后再销毁,大量的fork操作造成CGI的性能较差
- CGI程序 / php-cgi: PHP解析器
-
FastCGI: CGI的升级版,特点是采用
master-worker
进程管理模式,提升PHP解析器的性能和效率 - PHP-FPM(PHP FastCGI Process Manager): 针对PHP的FastCGI的一种实现,它负责管理一个进程池,处理来自web服务器的请求,内置于PHP,支持平滑重载PHP配置
Nginx与PHP通信过程
我们都知道,PHP作为脚本语言,是需要解析器解释执行的,一般用 php解析器(/usr/bin/php) 执行php文件,但是用户要访问php文件,怎么合理去安排php解析器(/usr/bin/php)有序、高效执行php文件呢,这就是Nginx的作用了,它可以看做是客户端与PHP解析器的中间媒介,合理调度PHP解析器去解析PHP程序。
一般的交互过程是:客户端向服务器请求一个非静态资源(如PHP文件,非html文件、图片等),Nginx通过CGI协议将请求分发给PHP-FPM进程,由PHP-FPM转发给PHP解析器,PHP解析完成之后,将解析的内容交由PHP-FPM,返回给客户端
nginx操作
nginx采用的是master-worker
多线程模式,所以在操作nginx时,只需要与nginx的master进程通信即可,nginx0.8之后可以采用命令行参数进行nginx的操作
启动nginx:nginx -c nginx.conf
平滑重启nginx:kill -HUP 主进程号
重启nginx: nginx -s reload
从容停止nginx: kill -QUIT 主进程号
快速停止nginx:1. nginx -s stop
2. kill -TERM 主进程号
Nginx配置
Nginx配置文件主要分4部分
- main(全局设置): main部分的指令将影响其他所有的设置
- server(主机设置): server部分的指令主要作用于指定的主机和端口
- upstream(负载均衡服务器设置): upstream指令主要作用于负载均衡的设置
- location(指定网页的设置): 主要用于匹配上的网页的设置
Nginx配置文件demo
#Nginx的worker进程运行用户以及用户组
user www www;
#worker开启的进程数,一般设置为与cpu核数一致
worker_processes auto;
#定义错误日志,error_log级别 [debug|info|notice|warn|crit]
error_log /var/log/nginx/error.loh info;
#指定进程ID存储文件位置
pid /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
#单个进程最大的文件连接数
worker_rlimit_nofile 51200;
events
{
#选用的事件模型 [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
use epoll;
#每个进程最大连接数
worker_connections 51200;
#串行工作方式(降低负载,当服务器吞吐量大时,使用并行工作方式)
multi_accept on;
}
http
{
#文件扩展名与文件类型映射表
include mime.types;
#指定文件类型为二进制流
default_type application/octet-stream;
#服务器名字的hash表大小
server_names_hash_bucket_size 128;
#客户端请求头的header_buffer大小
client_header_buffer_size 32k;
#客户端请求头中较大的消息头的缓存最大数量和大小
large_client_header_buffers 4 32k;
#客户端请求单个文件的最大字节数
client_max_body_size 50m;
#开启高效传输模式
sendfile on;
#防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
#客户端链接超时时间
keepalive_timeout 60;
#FastCGI相关参数,改善网站性能,减少资源占用
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
#gzip模块设置(服务器端压缩页面,传到浏览器后浏览器解压并解析,主流浏览器都支持解析gzip压缩过的页面)
#开启gzip压缩
gzip on;
#最小压缩文件大小
gzip_min_length 1k;
#压缩缓冲区
gzip_buffers 4 16k;
#压缩版本
gzip_http_version 1.1;
#压缩等级1-9,等级越高,压缩效果越好,节约宽带,但CPU消耗大
gzip_comp_level 2;
#压缩类型
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
#前端缓存服务器缓存经过压缩的页面
gzip_vary on;
#Nginx作为反向代理时启用,根据请求头中的Via字段,决定是否启用gzip压缩
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
#低版本的Nginx可能存在漏洞
## 隐藏Nginx的版本信息
![展示版本信息](http://39.108.219.103/nginx_version.png)
![隐藏版本信息](http://39.108.219.103/nginx_no_version.png)
server_tokens off;
#用户的访问日志
access_log /var/log/nginx/access.log;
server
{
#监听端口
listen 80 ;
#listen [::]:80 default_server ipv6only=on;
#访问域名
server_name localhost;
#默认页面,优先展示:index.html > index.htm > index.php
index index.html index.htm index.php;
#指定虚拟主机的网页根目录
root /home/wwwroot;
###可以单独为此虚拟主机指定访问日志和错误日志的存放路径
#自定义错误页面(注:后面的路径是相对地址,相对于虚拟主机的网页根目录)
error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php.conf;
#配置Nginx状态页
location /nginx_status
{
stub_status on;
access_log off;
}
access_log /home/wwwlogs/access.log;
}
include vhost/*.conf;
}
location配置规则
匹配符号
- = 精确匹配
- ~ 区分大小写的匹配
- ~* 不区分大小写的匹配
- ^~ 以某个字符串开头进行匹配
- / 通用匹配,如果没有其他匹配,任何请求都会匹配上
匹配优先级
location =
> location 完整路径
> location ^~ 路径
> location ~ 、~*
> location 部分起始路径
> /
Rewrite规则
rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。
location和rewrite都能实现跳转,主要区别是:location是对一类路径做控制访问或者反向代理,而rewrite是在同一域名内更改获取资源的路径(因为rewrite只能对域名后边的除去传递的参数外的字符串起作用)
-
flag标志位
1.last: 完成rewrite之后,将新的url重新匹配server里面的location。(ps: 当flag标志位为空时,默认是
last
)2.break: 完成rewrite之后,网页根目录如果存在指定文件或资源,则直接请求成功,返回200;如果请求内容不存在,则返回404
3.permanent: 返回301永久重定向(地址栏会显示跳转后的地址)
4.redirect: 返回302临时重定向(地址栏会显示跳转后的地)
5.关于 last和break的区别: 可以把
last
当做编程语言中的continue
,完成rewrite,不结束匹配,需要重新去匹配server中的location,break
和编程语言中的break
是一样的,rewrite完成之后,直接退出循环(location匹配),进行下一步操作
Nginx做反向代理服务器
正向代理:
- 定义: 为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并获得内容返回给客户端。
- 通俗定义: 你(客户端)正处于创业的关键阶段,现在急需500W就能使项目起死回生,你找到阿里巴巴的马先生(服务器)借钱,不用想,当然是碰一鼻子灰。巧的是,我(代理服务器)和马云非常熟络,所以你就通过我,去向马云借钱,最后把钱借到,你如愿成为高富帅,登上福不服,迎娶白富美。
-
作用:
- 访问之前无法访问的资源 (如Google、向马云借钱)
- 服务器不知道访问的客户端(马云并不知道其实是你借的钱)
- 服务器返回的数据都是通过代理服务器分发给客户端,在分发之前,代理服务器都会在硬盘中保存一份,代理服务器可以做缓存,加速访问资源
-
对客户端访问进行管理(代理服务器可做管理服务器,所有需要上网的客户端都必须通过代理服务器)
反向代理:
定义: 客户端请求服务器的资源,服务器上其实是没有此资源的,所以它就从同局域网的兄弟服务器那,取了资源来返回给你,当成是自己的资源。
通俗定义: 你(客户端)又欠费停机了,拨打10086的客服电话(反向代理服务器),你不管接电话的是MM还是GG,不管接电话的话务员(服务器)高矮胖瘦,反正都得给我解决问题,最后通过打电话得知,我的手机确实欠费了(得到的答复,就是请求的资源)。
-
作用:
- 负载均衡,利用反向代理服务器,分发请求给不同的服务器,优化网站的负载
- 保证内网安全,反向代理服务器当成一个隔离防火墙,过滤web攻击
-
同正向代理,也有缓存的作用
-
Q: 为什么感觉正向代理和反向代理的定义看上去差不多(都是 client -> proxy -> server)呀?
A: 两个代理确实都是 client -> proxy -> server 这样一个过程,但是正向代理,client和proxy是一伙的,proxy帮助client隐藏身份,好去攻打server。而反向代理,proxy和server是一伙的,proxy帮助server隐藏身份,由proxy去对外抵御攻击。
设置反向代理
upstream www_koumm_com {
server 127.0.0.1:8000 down;
server 127.0.0.1:7070 backup;
server 192.168.129.22:8000 weight=5;
server 192.168.129.23:8000;
}
server {
listen 80;
server_name www.koumm.com;
access_log logs/www.koumm.access.log main;
location / {
proxy_pass http://www_koumm_com;
}
}
上面的配置文件就实现了初步的负载均衡,所有的请求都会通过proxy_pass转发到后台的服务器,后台的服务器通过upstream建立。upstream结点中的服务器支持4种方式进行请求分配:
- 1.轮询(默认)
每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 - weight
指定轮询的权重,weight和访问成正比,用于后端服务器性能不均的情况
- weight
- ip_hash
每个请求按访问ip的hash结果分配,确保每位访客固定访问一个后端服务器,可以解决session的问题
- ip_hash
- fair(第三方)
按后端服务器响应时间来分配请求,响应时间短的优先
- fair(第三方)
每个设备可以有5种不同的状态:
1. down: 当前server不参与负载
2. weight: weight越大,负载的权重就越大
3. max_fails: 允许请求失败的最大次数(默认为1)
4. fail_timeout: max_fail失败之后,暂停的时间
5. backup: 定义备份机器,只有其他机器在忙或者down的时候,才会分发到backup机器
相关博客:
Nginx从听说到学会 - 简书
nginx配置location总结及rewrite规则写法 - 官朝辉 - 博客园
使用Nginx实现反向代理 - CSDN博客
正向代理与反向代理【总结】 - Anker's Blog - 博客园
反向代理为何叫反向代理? - 知乎
nginx fastcgi配置 - lpfuture - 博客园
如果这篇文章对你有帮助,请点个赞哈,感谢