介绍
-
Nginx开源版 http://nginx.org/en/ 官方原始的Nginx版本 -
Nginx plus商业版 开箱即用,集成了大量功能 -
Open Resty https://openresty.org/cn/ OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。更适用于需要大量二次开发的场景,有极强的扩展性 -
Tengine https://tengine.taobao.org/ 由淘宝网发起的Web服务器项目。它在Nginx (opens new window)的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网 (opens new window),天猫商城 (opens new window)等得到了很好的检验。相比于Open Resty,扩展性不够强,但是能够满足绝多数使用场景
安装
参考:nginx安装
目录
conf #配置文件
|-nginx.conf # 主配置文件
|-其他配置文件,都被引入到了nginx.conf
html #静态页面
logs
|-access.log #访问日志(每次访问都会记录)
|-error.log #错误日志
|-nginx.pid #进程号
sbin
|-nginx #主进程文件
*_temp #运行时,生成临时文件
配置
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {# 指定到html文件夹下找/50x.htm
root html;
}
}
}
sendfile
打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
使用场景
不同二级域名,映射到不同静态网页
可以写多个server字段,从前向后匹配,先匹配到哪个就用哪个
用户访问www.aaa.com ,就会走到第一个server配置;www.bbb.com 走到第二个配置
http {
server {
listen 80;
server_name www.aaa.com;
location / {
root html/pro;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.bbb.com;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
不同域名,映射到同一静态页面
server_name
- 可以写多个,用空格分开
- 使用通配符(*)
- 使用正则表达式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{
server {
listen 80;
server_name *.aaa.com ~^[0-9]+\.aaa\.com$;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
网关服务器
上图中,应用服务器,不能直接被外网访问到,只能通过Nginx服务器进行访问(使用proxy_pass),这时候这台Nginx服务器就成为了网关服务器(承担入口的功能)
所以,我们启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="本机nginx的ip" port protocol="tcp" port="8080" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"
firewall-cmd --reload
firewall-cmd --list-all
反向代理
反向代理:这种代理方式是代理后端服务器,通常是多个,客户端只看到的是nginx并不能直接访问后端服务器。因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。
负载均衡
负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)
反向代理 + 负载均衡
nginx.conf配置文件
启用proxy_pass,root和index字段就会失效
proxy_pass后的地址必须写完整 http://xxx ,不支持https
当访问localhost时(Nginx服务器),网页打开的是http://xxx (应用服务器),但是网页地址栏写的还是localhost
http{
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
定义地址别名
使用upstream定义一组地址【在server字段下】
访问localhost,访问都会代理到192.168.174.133:80 和192.168.174.134:80 这两个地址之一,每次访问这两个地址轮着切换(后面讲到,因为默认权重相等)
http{
upstream httpds{
server xxx:80 weight=10;
server xxx:80 weight=20;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpds;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
upstream httpds{
server 111:80 weight=10;
server 222:80 weight=80 backup;
}
upstream httpds{
server 111:80 weight=10 down;
server 222:80 weight=80;
}
动静分离
当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中
例子:
- 如果请求的资源地址是
location/ ,/ 的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器 - 如果请求的资源地址是
location/css/* ,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
location /css {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
使用正则
location ~*/(js|css|img){
root html;
index index.html index.htm;
}
url rewrite
rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flagt标记
正则:per1森容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记说明:
last
break
redirect
permanent
浏览器地址栏访问 xxx/123.html 实际上是访问xxx/index.jsp?pageNum=123
server {
listen 80;
server_name localhost;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
防盗链
当我们请求到一个页面后,这个页面一般会再去请求其中的静态资源,这时候请求头中,会有一个refer字段,表示当前这个请求的来源,我们可以限制指定来源的请求才返回,否则就不返回,这样可以节省资源
valid_referers [server_name] 或 none
if ($invalid_referer) {
return 403;
}
设置有效的refer值
none:检测地址没有refer,则有效 server_name:检测主机地址,refer显示是从这个地址来的,则有效(server_name必须是完整的http://xxxx) 【注意】if ($invalid_referer)中if后有个空格,不写就会报错!
例子:这里设置nginx服务器中的img目录下的图片必须refer为http:192.168.174/133才能访问
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
location /img{
valid_referers http:192.168.174/133;
if ($invalid_referer){#无效的
return 403;
}
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
如果引用这张图片的页面且refer并没有被设置,图片无法加载出来
如果直接访问图片地址,因为没有refer字段指向来源,会直接显示Nginx的页面
高可用场景
配置证书
购买服务器——>购买域名,并解析到这个主机——>购买证书,绑定到域名上,并且把证书文件安装到服务器,并在Nginx上配置好
这时候,这个域名就可以使用https进行访问里(https://xxxx ),浏览器上会有一个小锁
下载证书
下载后,解压压缩包,可以看到两个文件,一个是 xxx.key (私钥)和xxx.pem (证书)
将两个文件上传到Nginx目录中,记得放置的位置。我这里直接放在nginx.conf配置文件所在的目录(/user/local/nginx/conf ),所以写的都是相对路径
server {
listen 443 ss1;
ss1 certificate xxx.pem;
ss1_ certificate_key xxx.key
}
|