nginx技术
Nginx
处理高并发,单台服务器存在服务瓶颈
Nginx属于nio ,noblocking Io非阻塞式的
Apache属于Bio,Blocking IO 阻塞式的
安装部分
依赖安装:yum -y install gcc openssl-devel pcre-devel zlib-devel -y
解压源码 tar -zxvf nginx-1.8.1.tar.gz
在源码目录下运行配置文件configure并指定安装目录
cd nginx-1.8.1
./configure --prefix=/opt/sxt/nginx
在源码目录下编译安装
make && make install
命令部分
在软件目录/opt/sxt/nginx/sbin中执行nginx
启动 ./nginx
快速关闭 ./nginx -s stop
普通关闭 ./nginx -s quit
重载配置文件 ./nginx -s reload (在启动状态下使用,立即生效)
重新打开日志文件 ./nginx -s reopen
启动后访问端口默认: 192.168.163.10:80
关于直接访问nginx页面
在软件的html目录下,加载html页面与其他静态资源(图片等),该目录为网页直接访问nginx的文件的根目录。http://node2/123.jpg
配置部分
文件路径:opt/sxt/nginx/conf/nginx.conf (只需要配置主节点,其他节点启动tomcat作为服务节点)
全局配置
worker_processes 运行进程数 ,一般与cpu核数一致
error_log日志的路径和格式类型
pid 当前进程存放的位置
- #user nobody; 用户运行nginx
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
event配置(线程数)
worker_connections用于配置每个进程的线程数
- events {
worker_connections 1024;
}
http(网络信息)
include 接收的请求资源的类型的配置文件
default_type 数据发送的方式
log_format日志格式 并定义了main的格式名称 ,可以自定义sxt的日志格式
access_log访问日志的路径及格式(格式引用log_format)
sendfile 基于内核的数据拷贝方式,减少拷贝的内存占用
tcp_nopush 是否关闭争抢方式服务,可能造成惊群效应
keepalive_timeout保持与浏览器服务的长链接时间,一个链接实现多次请求
可以设置为0,使得连接切换明显,便于测试
gzip 文件是否以压缩方式发送
server配置虚拟主机
upstream配置代理集群
- 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"';
#log_format sxt '$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 0;
#keepalive_timeout 65;
#gzip on;
upstream
server {...}
}
upstream 集群配置
server配置集群的各主机及端口;
集群默认使用轮询的方式调用节点
每个节点后可加入weight权重,值越大分配越多
least_conn属性 实现最少连接负载平衡,用于将请求分配到最少连接节点上
ip_hash属性 用于确保同一客户端的请求只定向到一台服务器上(除非不可用),实现会话持久性
- upstream xxx{
least_conn;
server 192.168.163.11:8080 weight=3;
server 192.168.163.12:8080;
server 192.168.163.13:8080;
}
#注意结尾的分号
server(虚拟主机)
server位于http中,可以写多个service
虚拟主机:一般都是基于域名(server_name)和端口(listen )区分虚拟主机,可以基于ip。nginx根据请求的域名和端口分配不同的server虚拟主机,执行对应的服务。
listen为nginx监听的端口
server_name为监听的主机名或IP,可以设置多个空格分隔
location 拦截uri及代理配置
charset字符集
access_log 针对当前主机的访问日志及格式
error_page 错误页面(了解)
proxy代理php相关内容...(了解)
- server {
listen 80;
server_name basenode;
location / {
root html;
index index.html index.htm;
}
#charset koi8-r;
#access_log logs/host.access.log main;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html { root html; }
}
以下基于ssl的是https的代理
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_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
location(拦截与分配)
位于server中,用于拦截请求并指定代理服务器
proxy_pass定义所代理的服务器或集群,注意结尾加分号
root为根目录,index为默认的访问地址(了解)
内部加载访问控制allow与deny
- 系统默认的nginx主页地址
location / {
root html;
index index.html index.htm; }
通过代理实现服务器的代理
location / {
proxy_pass http://192.163.163.11:8080;
}
通过代理实现服务器集群的代理
location / {
proxy_pass http://upstream的集群名;
}
location / {
allow 192.168.78.0/24;
deny 192.168.78.1;
allow 10.1.1.0/16;
allow 192.168.1.0/32;
deny all;
proxy_pass http://xxx:8080;
}
关于拦截(资源静态化)
格式:location 规则 正则表达式 { }
规则包括
= 开头表示精确匹配
^~ 开头表示uri以某个指定字符串开头
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
! 取反
/ 通用匹配,任何请求都会匹配到
主要涉及
^~ /static/ 指定静态资源
~ .(gif|jpg|png|js|css)$指定后缀结尾
~* .png$ 指定某一类文件后缀
-
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
Tips:
http://localhost/ 将匹配规则A
http://localhost/login 将匹配规则B
按照顺序依次匹配,一旦匹配到第一个规则,不再向后匹配,因此需要注意规则的顺序
http://localhost/b.jpg 满足规则D和规则E,但是规则D顺序优先,规则E不起作用,
http://localhost/static/c.png 则优先匹配到 规则C
http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到。
http://localhost/category/id/1111 则最终匹配到规则H,其他规则均不满足,一般属于后台请求。
静态资源服务器
将静态资源直接放在nginx上的示例,也可以配置专门的服务器执行静态资源的服务。
- #使得www.123.com/static/xxxx 的静态资源请求直接到nginx服务中的statices文件夹获取。#statices文件夹创建路径在/opt/sxt/nginx/statices
server{
listen 80;
server_name www.123.com;
location ^~ /static/ {
alias statices/;
}
location / {
proxy_pass http://192.168.163.11:8080;
}
}
可以将静态资源配置到其他域名中。
- #www.123.com的页面中可以请求www.456.com/static/xxxx的静态资源呢,资源的存放路径同上
- server{
- listen 80;
- server_name www.123.com;
- location / {
- proxy_pass http://192.168.163.11:8080;
- }
- }
- server{
- listen 80;
- server_name www.456.com;
- location ^~ /static/ {
- alias statices/;
- }
- }
将静态资源指向tomcat时,默认指向webapps/项目/static/目录下(www.123.com/static/xxx.jpg)
- server{
- listen 80;
- server_name www.123.com;
- location ^~ /static/ {
- proxy_pass http://192.168.163.11:8080;#指向静态资源所在的tomcat
- }
- }
关于访问控制
allow允许访问,deny拒绝访问
从上往下依次判断,找到第一个匹配的判断条件后,不再执行后面的条件判断。
all表示全部请求匹配
注意这里是针对客户端的ip及访问端口的范围限制(192.168.78.0/24)
- allow 192.168.78.0/24;
- deny 192.168.78.1;
- allow 10.1.1.0/16;
- allow 192.168.1.0/32;
- deny all;
关于测试
使用各节点的tomcat进行测试:监听各节点的8080端口
使用tomcat主页进行访问,需要对主页进行修改:
主页路径 /opt/sxt/apache-tomcat-7.0.61/webapps/ROOT/index.jsp
将主页修改为以下代码,使得网页显示当前访问的节点和session连接编号
- <h1>xxx节点<h1>
- <%=session.getId() %>
在访问控制中本地主机的ip是子网前三位+.1,也就是192.168.163.1
正向代理与反向代理
正向代理为客户工作,
需要知道代理地址与目标地址
通过代理访问目标地址
反向代理为服务器工作
只需要知道反向代理地址,不需要指定特定服务器
反向代理配置了规则,通过规则将请求指向对应的服务器
Session一致性问题
由于集群并非单台服务器,需要保证客户访问session在集群中的一致
解决方式
1 session复制 tomcat自带功能(了解)
2 配置管理软件处理,整合tomcat,将session存数据库
memcached方案
yum install memcached -y
service memcached start
chkconfig memcached on(可选)
telnet localhost 11211 检查是否启动 quit退出 (session共享服务器的端口为11211 )
将memcached的依赖包复制到需要session共享的各tomcat服务器中,路径为/opt/sxt/apache-tomcat-7.0.61/lib
修改tomcat服务器的配置文件,/opt/sxt/apache-tomcat-7.0.61/conf/context.xml
- #注意修改memcachedNodes也就是session共享服务器,也就是memcached所安装的服务器ip:11211
- <Manager
- className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
- memcachedNodes="n1:192.168.163.10:11211"
- sticky="true"
- lockingMode="auto"
- sessionBackupAsync="false"
- requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
- sessionBackupTimeout="1000"
- transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
- />
重启tomcat :./shutdown.sh ./startup.sh
上述配置值使用于同一个server集群中共享
跨域解决方案(待研究)
domain设置
- location / {
- proxy_cookie_domain b.com a.com;
- proxy_pass http://b.com;
- }
使得b.com的cookice存到a.com页面中(session随着cookie迁移)
参考https://blog.csdn.net/u013314786/article/details/84584374
https://www.cnblogs.com/kevingrace/p/5707750.html
nginx技术的更多相关文章
- Nginx技术进阶详讲
Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...
- Nginx技术研究系列5-动态路由升级版
前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...
- Nginx技术研究系列3-OpenResty安装配置
上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...
- Nginx技术研究系列6-配置详解
前两篇文章介绍了Nginx反向代理和动态路由: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 随着研究的深入,很重要的一点就是了解 ...
- Nginx技术研究系列2-基于Redis实现动态路由
上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...
- Nginx技术研究系列4-Nginx监控-Nginx+Telegraf+Influxb+Grafana
搭建了Nginx集群后,需要继续深入研究的就是日常Nginx监控. Nginx如何监控?相信百度就可以找到:nginx-status 通过Nginx-status,实时获取到Nginx监控数据后,如何 ...
- Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...
- Nginx技术研究系列1-通过应用场景看Nginx的反向代理
随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名. 这么多的WebApi站点这么多的域名,管理和维护成本很 ...
- nginx技术分享 (转)
原文地址:http://blog.csdn.net/nethibernate/article/details/6628267 Nginx的作用: HTTP Server 反向代理,用于将用户的请求转发 ...
- Nginx技术深入剖析
Nginx软件功能模块说明 核心功能模块(Core functionality):主要对应配置文件的Main区块和Events区块. 标准的http功能模块: 企业 场景常用的Nginx http功能 ...
随机推荐
- K8S ? K3S !
K8S ? K3S ! K3S 踩坑开始 歪比歪比(奇怪的服务器) 服务器选择我熟悉的 Centos K3S内置 Containerd 但是!作为一个服务器使用自然是要用常见的一点的容器 Docker ...
- C#设计模式学习笔记:(12)代理模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...
- Http API触发小程序云函数案例
1.创建云函数 在云开发中创建云函数(sum,调用需要两个参数:a.b): 2.invokeCloudFunction触发云函数 const request = require('request'); ...
- Mysql:初识MySQL
转载自:https://www.cnblogs.com/hellokuangshen/archive/2019/01/09/10246029.html Mysql:初识MySQL 只会写代码的是码农: ...
- MySQL真正的UTF-8字符集utf8mb4
MySQL有个utf-8的坑 MySQL 的 utf8 实际上不是真正的 UTF-8.utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节. MySQL 一直没有修复这个 ...
- 「Flink」使用Managed Keyed State实现计数窗口功能
先上代码: public class WordCountKeyedState { public static void main(String[] args) throws Exception { S ...
- luogu2173 [ZJOI2012]网络
题目链接 problem 给出一个无向图,每条边有一种颜色.每种颜色都构成一个森林.需要完成以下操作. 修改点权 修改边的颜色 询问某种颜色的森林中某条路径上点权最大值 solution 颜色数量不超 ...
- .net 用反射获取当前运行的程序集中的所有Controller与Action
public string InitPermission() { // 通过反射加载程序集 // var baseType = Assembly.LoadFile(@"G:\testproj ...
- clr from c# 字符 ,字符串 和 文本处理
1,字符----------在.net中,字符总是16位的Unicode代码值.每个字符都是一个System.Char结构(值类型)的一个实列. using System; public class ...
- nuget打包上传
准备工作 下载nuget.exe,以及gui推送编辑工具 Nuget Package Explorer (可选) 设置nuget环境变量. 流程 完成项目 cmd控制台cd到项目目录下(项目目录不是解 ...