Nginx是一个高性能的HTTP服务器和反向代理web服务器,主要功能就是反向代理,通过配置文件可以实现负载均衡和集群,静态资源虚拟化
正向代理:客户端 ---> 代理服务器 ---> 目标服务器 ---> 内容返回
反向代理:用户请求目标服务器,由代理服务器决定将请求分发到哪个节点的IP上
区别:正向代理是向目标服务器隐藏真实的客户端,反向代理是向客户端隐藏真实的服务器
当Nginx启动后会自动有一个master进程和一个worker进程,master进程是主进程,worker是工作进程,工作进程是为主进程进行服务的,当主进程接收到信号之后,会将信号发送给工作进程,由工作进程去完成各种请求,当worker进程异常退出或关闭时,master进程会重新foke出一个新的工作进程来进行工作,工作进程的数量可以通过nginx.conf文件进行配置,每个woker进程可以连接多个客户端,连接数量也可以通过nginx.conf这个文件进行配置,在envents这个节点中进行配置,默认的每个woker进程连接最大值是1024,这个数值是可以手动修改的,你可以设置为10240。
每个woker进程可以连接多个客户端,客户端发来的请求是有顺序的,woker进程也是顺序执行请求,当其中某个客户端如果陷入了阻塞时,那么woker进程会立即处理下一个客户端的请求,而不会一直等待阻塞的客户端,这种类似于IO多路复用模型
当我们在本地部署了Nginx之后,打开浏览器输入localhost之后就能直接访问到nginx的首页,这是因为如果我们不做任何配置,直接在浏览器中输入地址并且不加端口号,那么默认请求的就是80端口,而在nginx.conf文件中就有一个server节点是监听的80端口:
server {
#监听的端口号
listen 80;
#访问的路径,如果是部署在虚拟机上或者是外网上,那么就输入虚拟机的IP地址或者外网的域名,
#如果你是在本地部署的,那么直接输入localhost
server_name localhost;
#这个端口默认访问的路径,location斜杠后面的内容会拼接到root设置的目录后面
#在这段配置中最终的访问路径就是html/,这个路径是可以自定义的
location / {
root html;
index index.html index.htm; #默认的显示页面
}
}
自定义路径设置:
server {
listen 80;
server_name localhost;
location /img {
root /home;
}
}
假设nginx部署在虚拟机,ip为192.168.1.7
访问方式:192.168.1.7/img/xxx.png
使用别名:
server {
listen 80;
server_name localhost;
location /static {
alias /home/img;
}
}
访问方式:192.168.1.7/static/xxx.png
默认匹配规则
server {
listen 80;
server_name localhost;
location / {
root /home;
}
}
精准匹配
server {
listen 80;
server_name localhost;
location = /img/face1.png {
root /home;
}
}
如果使用精准匹配的话,那么只能访问到face1.png这张图片,同一目录下的其它图片是访问不到的,文件夹同理
正则表达式匹配
server {
listen 80;
server_name localhost;
location ~* \.(GIT|png|jpg|jpeg) {
root /home;
}
}
正则表达式的匹配规则是以~开头的,*代表不区分大小写,匹配规则为只能访问home目录下设置好的图片
格式,不是以上设置的图片格式或其它文件,将无法访问
nginx的命令都是需要在sbin目录下执行才有效的
./nginx -s -stop : 快速关闭,不管当前是否还有用户请求在执行,都会直接进行关闭(不推荐)
./nginx -s -quit : 当用户的请求还在执行时不会进行关闭,直到用户的请求处理完成之后,在此期间,不会接受新用户的请求
./nginx -t : 用来检测配置文件的语法是否正确,设置是否正确的
./nginx -s reload : 重新加载或重新启动nginx服务,通常是在修改了nginx的配置文件之后使用
./nginx -v : 显示当前Nginx的版本
我们日常在浏览器中输入各种域名去访问各种网站,例如:www.baidu.com
为什么输入域名之后就可以访问到对应的网站,我们来看看中间隐藏的部分
从上面的步骤我们不难看出,最终我们还是通过IP来访问各种网站了,只不过其中有一系列的步骤对用户是透明的,那既然都是通过IP来访问,为什么还需要有域名?
因为IP是一大串的数字,实在不好记忆,而且IP地址因为各种原因还可能导致变更,而域名是不会变得,又相对好记忆,所以现在都是使用的域名
那假设我们并没有自己的云服务器和备案过的域名,又想通过域名的方式来访问本地的资源或者虚拟机上的资源,我们可以通过修改hosts文件来对我们的IP进行一个域名的绑定,只不过这个域名只能在自己本地使用,外网是无法进行访问的。
前面我们说的,在浏览器中输入域名之后是会去DNS服务器中查找的,但其实在这之前,浏览器会先去我们本地的hosts文件中查找,如果没有的话,再去的DNS服务器
在mac OS系统中,我们可以通过命令行打开hosts文件:
vim /etc/hosts 就可以看到如下:
127.0.0.1 localhost
127.0.0.1是我们本地的IP,绑定了localhost,所以我们在浏览器中输入localhost就可以访问本地的资源,假设我们在本地部署了nginx服务,那么启动之后通过浏览器输入localhost就可以打开nginx的首页,如果我们不想用localhost来访问,而是通过我们自定义的域名来访问,那我们可以这样做:
127.0.0.1 www.baidu.com
这样在浏览器中输入www.baidu.com就不会访问到百度的页面了,而是到了nginx的首页
server {
listen 80;
server_name localhost;
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' $http_origin;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods $http_access_control_request_method;
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
add_header Access-Control-Max-Age 3600;
add_header Content-Length 0;
return 200;
}
}
//1.在nginx.conf文件中配置upstream上游服务,在这个指令块中写上你需要代理的服务的IP加端口号,
//这里代理的是tomcat服务器
upstream tomcats {
server 192.168.1.7:8088;
}
//2.在server指令块中
server {
listen 80;
server_name www.lcz.com;
location / {
proxy_pass http://tomcats;
}
}
我们来解释一下这段配置的含义,假设,我们在虚拟机上搭建一台Nginx服务器中,并为这台虚拟机的IP绑定了
一个自定义的域名:www.lcz.com,并监听的是80端口,所以,我们在浏览器中输入www.lcz.com就可以直接
访问到Nginx了,到了Nginx之后会就查看location的路径匹配了,这个时候会发现,location中有个指令:
proxy_pass,这个指令就是反向代理的意思,然后发现它配置了一个http://tomcats的东西
最后会去配置文件中找有没有名为tomcats的upstream指令块,找到之后发现upstream指令块中配置了一个
server指令,这个指令指向了一个部署了tomcat的服务器IP,就会将请求转发到这个部署了tomcat的
服务器上,这就实现了反向代理的功能
反向代理:发送请求到目标服务器,由代理服务器决定将请求落在哪个目标服务器的节点上
在upstream指令块中配置多个server指令,就组成了一个集群,根据负载均衡的不同策略,
决定将请求落在哪台服务器上
upstream tomcats {
server 192.168.1.7:8088;
server 192.168.1.8:8088;
}
server {
listen 80;
server_name www.lcz.com;
location / {
proxy_pass http://tomcats;
}
}
轮询
Nginx的负载均衡策略默认的就是使用轮询,轮询就是将请求平均的分配给不同的tomcat
假设我们现在有两台tomcat,分别是tomcat1和tomcat2,那么在使用轮询的策略时,当用户发起第一
次请求时会落在tomcat1,第二次就tomcat2,第三次就tomcat1,依次类推
权重
权重越高的tomcat被落到的请求也就越多,在默认的轮询策略中,所有的tomcat的权重都1,所以请求
是平均分发的
upstream tomcats {
server 192.168.1.7:8088 weight=1;
server 192.168.1.8:8088 weight=2;
}
原文:https://www.cnblogs.com/islcz/p/Nginx.html