一、ngnix简介
nginx是一个高性能的HTTP服务器和方向代理的web服务器。特点是内存少,并发能力强 ,处理并发的能力十分强大,能够承受高负载的考验。 nginx有以下的几个基本作用:
-
作为web服务器
- 作为静态页面的web服务器,也就是可以通过nginx部署静态页面,非常方便,但是不支持java,也就是java只能和tomcat配合。
-
正向代理
- 局域网中的客户端需要访问internet,就需要通过代理服务器来进行访问,这种类似的代理方式就称为正向代理
-
反向代理(部署项目的时候常用)
- 方向代理,就是客户端不需要什么配置就能访问服务(无感)。比如通过域名访问,实际上是ip地址
- 简单来说就是请求发送给反向的代理服务器,代理服务器找到真实的服务器获取数据,然后返还给客户端,隐藏了服务器的真实地址。
-
负载均衡
-
负载均衡简单来说就是当某一个时间段有大量的请求的时候,如果只让一个服务器来处理请求,很有可能处理不过来,服务器负载很大,可能崩溃,就算通过纵向策略,提高服务器的配置也没从根源解决问题,且现在的硬件配置也是有限的,所以我们选择横向增加服务器的数量,将请求分发到各个服务器上,将负载分发到不痛的服务器,这就是负载均衡。
-
-
动静分离
- 动静分离的意思就是把动态页面和静态页面交给不同的服务器来解析,加快解析速度,从而加快了网站的解析速度,访问速度。
二、nginx常用命令和配置文件
1. 基本命令
- nginx -v 查看nginx版本
- nginx 启动nginx
- sudo systemctl start nginx 使用系统管理工具systemctl启动nginx
- sudo systemctl stop nginx 使用系统管理工具systemctl停止nginx
- sudo systemctl restart nginx 使用系统管理工具systemctl重启nginx
- sudo systemctl reload nginx 使用系统管理工具systemctl重新加载nginx
- nginx -s stop 关闭nginx
- nginx -s reload 重新加载nginx
2. Nginx配置文件
a. 配置文件位置
/etc/nginx/nginx.conf
b. 配置文件nginx.conf的组成
第一部分:全局块
如下,
user www-data;// 运行web服务器的特殊账户,
worker_processes auto; //允许生成的 worker process 数,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
pid /run/nginx.pid; //进程 PID 存放路径
第二部分:events块
events 块涉及的指令**主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。**这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
worker_connections 768; //最大链接数为768
multi_accept on; // 设置nginx服务器是否允许并发连接,默认注释
第三部分:http全局块
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 {
root html;
}
}
}
nginx配置最复杂,最需要配置的地方,需要注意的是:http 块也可以包括 http全局块、server 块。
-
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。 -
server块
配置映射的地方,这块与虚拟主机密切相关,每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。例如listen 80
,server_name example.com
。 - location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
三、Nginx反向代理配置实例1.1
a. location指令说明
该语法用于匹配URL
语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。关于location后跟的路径名的问题:
location / { # 根路径的配置 # ... } location /test/ { # 匹配以 /test/ 结尾的路径的配置,可以有../test/page_01/..,../test/page_02/等等多个。就是后面嵌套的目录不止一个 # ... } location /test { # 匹配 /test 开头的路径,/test/page_01, # ... } // 例如就只匹配
cdeqswx
b. server中的名词含义
server 一个server就相当于一个虚拟主机,一个http块中可以设置多个server
listen 端口号 表示监听的端口,是部署完成后访问服务的端口
server_name 主机名,可以是域名或则你的服务器ip
location 表示映射,在一个server中可以设置多个,表示映射关系
location中的alias 相当于设置location / xxx中的xxx为alias url中的url的别名
root 可以在location也可以http,server,if块中,在location中的作用是使用root url时候,location / xxx,路径需要加上xxx,即url/xxx…
index 后面可以跟一个或多个文件,表示要访问的文件资源,跟多个文件的时候,nginx会顺序寻找,文件1如果找不到或不能访问就去找下一个,一直如此知道找到能访问的文件
location中的proxy_pass 中文名为代理到…,作用就是将请求转发到后端服务器,基本语法为proxy_pass URL;一般在服务器可一个设置为localhost:端口号,因为程序就在服务器本机运行。
c. 实例
// 一般常用的是~ server { listen 8001; server_name 1.1.1.2; location ~ /vue/ { //表示请求以/vue/开头的路径,忽略大小写 proxy_pass http://localhost:8001 } location ~ /edu/ { //表示请求以/edu/开头的路径 proxy_pass http://localhost:8001 } }
- 全局 server 块
location = / {
# matches the query / only. // 只有当用户请求是/时,才会使用该location下的配置
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ] // 可以匹配所有请求
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
[ configuration C ] // 匹配以/images/开头的任何查询并停止搜索表示匹配URL时忽略字母大小写问题
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ] // 匹配任何以gif、jpg或jpeg结尾的请求
}
location的使用实例 —— 以index+root方式设置资源路径
server {
listen 8080;
server_name 47.108.157.141;
location / {
root /home/test/page;
index index.html;
}
location /second {
root /home/test/page/home/test/page后面,真正的路径其实是/home/test/page/second;
index second.html;
}
}
// 将root放在外面
server {
listen 1645;
server_name 47.108.157.141;
root /home/server/gitar;
index CDEFGAB.HTML;
location / {
try_files $uri $uri/ =404;
}
}
// 访问路径:http://47.108.157.141:8080/second.html,web服务器返回/home/test/page的下的secondlhtml,index.html同理,只不过没有second目录了
// 注意,这里second是root和index的结合,root表示访问资源的根本路径,index表示访问的文件,在第二个location中,web服务器寻找资源时候会将second加在/home/test/page后面,真正的路径其实是/home/test/page/second
location的使用实例 —— 以alias方式设置资源路径
alias也是用来设置文件资源路径的,它与root不同点主要在于root会保留/后面的元素加到寻找资源的路径上,alias是是直接将/后面的内容丢弃或则说直接用/后面的内容给寻找资源的路径取了一个别名。
例如:在/home/test/page/third有third.html, /home/test/page/second下有second.html,则两种方式如下:
alias:
location /third {
alias /home/test/page/third;
index third.html;
}
root:
location /second {
root /home/test/page;
index second.html;
}
c. location中的proxy_pass属性,当使用 Nginx 作为反向代理服务器时,proxy_pass
是一个重要的指令,用于指定将请求代理转发到的后端服务器
注意:
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。因为location的匹配模式。
一般proxy_pass后面有四种情况:ip:端口
;ip:端口/
;ip:端口/上下文
;ip:端口/上下文/
下面我就这四种情况进行举例说明。
例如访问地址:http://192.168.2.39:8081/hussarApi/test/getList。下方为代理地址
-
ip+端口
location /hussarApi/ { proxy_pass http://192.168.2.188:8280; //后面没有/ }
代理地址:
http://192.168.2.188:8280/hussarApi/test/getList
//url后无/,为相对路径,连同匹配部分hussarApi
也追加到代理地址上 -
ip:端口/
location /hussarApi/ { proxy_pass http://192.168.2.188:8280/; //多了一个/ }
代理地址:
http://192.168.2.188:8280/test/getList
//url后有/,为绝对根路径,会将hussarApi
部分去掉,代理地址拼接hussarApi
后面路径 -
ip:端口/上下文或则ip:端口/上下文/
后面没有/ location /hussarApi/ { proxy_pass http://192.168.2.188:8280/aaa; } // 后面有/ location /hussarApi/ { proxy_pass http://192.168.2.188:8280/aaa/; }
代理地址:
http://192.168.2.188:8280/aaa/test/getList(/)
都一样
//只要url后有上下文,会将访问地址hussarApi
去掉,代理地址直接拼接访问地址hussarApi
后面路径 -
尝试用上面第二种方法转发docker部署的应用时遇到一个问题,页面可以转发,但是其中的静态文件无法加载,因为请求路径改变,静态文件的路径也需要改变。
server { listen 4000; server_name 47.108.157.144; location /test/ { proxy_pass http://localhost:3000/; } }
注意:location 为正则表达式的时候2不能使用,即location 正则情况,url后面不能加 /,通常情况下使用最多的是用location / 直接用端口作为一个应用的标识.
server {
listen 4000;
server_name 47.108.157.10;
location / {
proxy_pass http://localhost:3000/;
}
}
root后面的路径 没有斜杠开头代表相对路径,从nginx服务器的根目录找,有斜杠开头表示绝对路径,从linux主机的根目录开始找
server_name 也可以用通配符匹配
server_name *.www.xxx; // 匹配以www.xxx结尾的域名
server_name www.xxx.*; // 匹配以www.xxx开头的域名
proxy_pass和root是二选一的,proxy_pass是代理后端服务。root是寻找静态资源