1、简介
Nginx 是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。
2、安装
2.1:安装gcc环境
yum install gcc-c++
2.2:安装pcre
yum install -y pcre pcre-devel
2.3:安装zlib
yum install -y zlib zlib-devel
2.4:安装openssl
yum install -y openssl openssl-devel
2.5:安装Nginx
下载源代码包:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
Nginx官网下载地址:http://nginx.org/en/download.html
建议下载稳定版本使用。
解压并安装 Nginx:
# tar -xvf nginx-1.18.0.tar.gz
# cd nginx-1.18.0
# ./configure
# make
# make install
2.6:修改配置文件 nginx.conf
vi /usr/local/nginx/conf/nginx.conf
3、运行
/usr/local/nginx/sbin/nginx -s reload
如果报 [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
错误,则执行 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 命令后再次启动运行 Nginx。
查看 Nginx 启动状态
ps -ef | grep nginx
注意:外部访问时要关闭防火墙。
访问 IP 地址:
Nginx 相关命令:
./nginx -s reload # 重新载入配置文件
./nginx -s reopen # 重启 Nginx
./nginx -s stop # 停止 Nginx
./nginx -s quit # 关闭 Nginx
4、Nginx的原型图
图解:
- 在正向代理中,Proxy 和 Client 同属于一个 LAN(图中方框内),隐藏了客户端信息。
- 在反向代理中,Proxy 和 Server 同属于一个 LAN(图中方框内),隐藏了服务端信息。
实际上,Proxy 在两种代理中做的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理了。
5、Nginx 的整体架构
Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处理网络请求与响应。
master进程主要用来管理worker进程,具体包括如下4个主要功能:
- 接收来自外界的信号。
- 向各worker进程发送信号。
- 监控woker进程的运行状态。
- 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
woker进程主要用来处理基本的网络事件:
- 多个worker进程之间是对等且相互独立的,他们同等竞争来自客户端的请求。
- 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
- worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。同时,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。
6、反向代理
反向代理你可以理解为:
网络上我重拳出击,现实中我唯唯诺诺。 ——键仙
你并不知道键仙的真实姓名,位置,年龄或任何东西,拥有很好的隐秘性。
反向代理也是如此。尽管可以访问服务器,但它不是真正的服务器。服务器的反向代理成功隐藏了真实的服务器地址。
Nginx 实现反向代理:
server {
listen 80;
server_name localhost;
location / {
#root /html # 跟目录:注意必须为跟路径,不能使用相对路径
#index index.html index.htm index.jsp;
proxy_pass http://180.101.49.11;
}
}
其中,http://180.101.49.11
是百度的 ip 地址,重新载入配置文件并重启后,访问 http://服务器ip地址
,会自动返回百度数据。
6.1:location块
location:
配置请求的路由,以及各种页面的处理情况。
server {
listen 80; # 指定捕获的端口,不指定默认为80端口
server_name localhost; # 表示nginx会捕获 localhost:80 路径
location ~*^.+$ { # 可以
#root html; # 跟目录:注意必须为跟路径,不能使用相对路径
#index index.html index.htm; #设置默认页:表示默认访问根目录下的index.html,或者是index.htm文件
proxy_pass http://xxxxxxxx; #请求转向:nginx捕获请求后,会转发给proxy_pass指定的路径
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
location 第一行是一个正则,对请求的url过滤,正则匹配,~ 为区分大小写,~* 为不区分大小写。
每一行都有注释,我们举个例子来巩固下。
server {
listen 9999;
server_name localhost;
location / { # nginx对跟路径进行捕获
root html; # 跟目录:注意必须为跟路径,不能使用相对路径
index index2.html index2.htm;
autoindex on; # 开启目录浏览功能;
autoindex_exact_size on; # 开启详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on; # 开启以服务器本地时区显示文件修改日期
}
error_page 500 502 503 504 /50x.html;
# 错误处理:当出现 500 502 503 504 时,请求就变为了 http://localhost:9999/50x.html
location = /50x.html { # nginx对/50.html进行捕获
root html;
}
}
- 这里我们写了两个 location,第一个 location 代表:当我们访问
http://localhost:9999
会自动拼接 url ,最终访问 url 为:http://localhost:9999/html/index2.html. - error_page 代表错误处理:当出现 500 502 503 504 时,请求就变为了 http://localhost:9999/50x.html
- 第二个location 对 /50x.html 进行了拦截过滤,拼接 url 后就变为了 http://localhost:9999/html/50x.html
6.2、location的拦截规则
https://www.cnblogs.com/quail2333/p/11181541.html
符号 | 含义 |
---|---|
= | **精确匹配:**用于标准uri前,要求请求字符串和uri严格匹配。如果匹配成功就停止匹配,立即执行该location里面的请求。 |
~ | **正则匹配:**用于正则uri前,表示uri里面包含正则,并且区分大小写。 |
~* | **正则匹配:**用于正则uri前,表示uri里面包含正则,不区分大小写。 |
^~ | **非正则匹配;**用于标准uri前,nginx服务器匹配到此uri后就结束,该模式匹配成功后,不会再向下进行匹配。 |
!~ 和!~* | 区分大小写不匹配,及不区分大小写不匹配 |
=== 精确匹配==会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 非正则匹配则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配带有=="~" 和"~*"==的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
1. “=”精准匹配
location = /news/ {
echo "test1";
}
[root@www quail]# curl 192.168.249.132/news/
test1
2. 区分大小写正则匹配
location ~ \.(html) {
echo 'test2';
}
location ~ \.(htmL) {
echo 'test3';
}
[root@www quail]# curl 192.168.249.132/index.html
test2
[root@www quail]# curl 192.168.249.132/index.htmL
test3
3. 不区分大小写的正则匹配
location ~* \.(html){
echo 'test4';
}
[root@www quail]# curl 192.168.249.132/index.htmL
test4
[root@www quail]# curl 192.168.249.132/index.html
test4
4. "^~"不进行正则匹配的标准匹配,只匹配前缀
location ^~ /index/ {
echo 'test5';
}
[root@www quail]# curl 192.168.249.132/index/
test5
[root@www quail]# curl 192.168.249.132/index/heihei
test5
[root@www quail]# curl 192.168.249.132/index/asdnmkalsjd
test5
5.普通匹配
location / {
echo 'test6';
}
[root@www quail]# curl 192.168.249.132
test6
6.其他
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
add_header Content-Type text/plain;
return 200 'A';
}
location = / {
# 精确匹配 /
add_header Content-Type text/plain;
return 200 'B';
}
location /static/ {
# 匹配任何已 /static/ 开头的请求,但是匹配之后,仍然会继续向下检索
# 只有当后面的正则匹配没有匹配到时,才会应用到此条规则. 疑问,不使用 ~*, ~, ^~ 的都不是正则匹配么?
add_header Content-Type text/plain;
return 200 'C';
}
location ~* (\.php$|\.htaccess$|\.git) {
# 不区分大小写的正则匹配以 .php 等结尾的请求
add_header Content-Type text/plain;
return 200 'D';
}
location ^~ /src/ {
# 匹配任何以 /src/ 开头的地址,匹配以后,不再往下检索正则,立即采用这一条。
add_header Content-Type text/plain;
return 200 'E';
}
location /static/a/ {
add_header Content-Type text/plain;
return 200 'F';
}
6.3、lcation块中常用属性
server :http结构下可以有多个server。请求进来 确定 使用哪一个 server由 server_name 确定
location :一个server下可以有多个location ,用来匹配 同一个域名下不同uri的访问
root :表示本地的根目录 ,可以写相对路径 也可以写绝对路径如 e:/nginx/html ;
index:访问主页 后面如果跟有多个页面 则会依次判断 如果第一个不存在 则向后匹配;
proxy_pass:转发 后跟系统地址
注意:root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
1、root的处理结果是:root路径+location路径
2、alias的处理结果是:使用alias路径替换location路径
deny:拒绝的拦截ip,表示此ip,nginx不进行拦截
allow:允许的ip,表示此ip可以nginx可以进行拦截
7、负载平衡
Nginx 负载平衡主要通过配置:upstream mysvr
假如,我们有两台服务器,某天,其中一台服务器突然挂掉了,那么我们就需要启动备用服务器。
upstream mysvr {
server 192.168.0.11:1111;
server 192.168.0.22:2222 backup; #备用
}
server {
listen 9999;
server_name localhost;
# nginx在捕获到请求后,会转发到上面配置的指定路径下的html目录下的index.html,或者index.htm页面路径下
location / {
proxy_pass http://mysvr;
root html;
index index.html index.htm;
}
}
再后来,我们又购置了一台服务器,要求它分担正在运行服务器的压力:(平均分配)
upstream mysvr {
server 192.168.0.11:1111;
server 192.168.0.33:3333;
server 192.168.0.22:2222 backup; #备用
}
又过了一阵,突然发现网上某台服务器打折扣,而且配置性能时原来单个服务器性能的 2 倍,我们马上购置了一台。
既然配置高,那我们就可以让它多做点事情。
添加权重:
upstream mysvr {
server 192.168.0.11:1111 weight=1;
server 192.168.0.33:3333 weight=1;
server 192.168.0.55:5555 weight=2;
server 192.168.0.22:2222 backup; #备用
}
执行顺序就变成了:
192.168.0.11:1111;
192.168.0.33:3333;
192.168.0.55:5555;
192.168.0.55:5555;
192.168.0.11:1111;
192.168.0.33:3333;
192.168.0.55:5555;
192.168.0.55:5555;
8、动静分离
动静分离:
所谓动静分离指的是当访问静态资源时,路由到一台静态资源服务器,当访问是非静态资源时,路由到另外一台服务器
静态资源配置:
如配置如下location
表示url为 /static/*.xxx 的图片或者js等静态资源则会到/html/static目录下去寻找资源
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
alias html;
}
动态资源配置:
其他访问url则转发到proxy_pass 指向的 http://192.168.25.35:8080;
location / {
proxy_pass http://192.168.25.35:8080;
}
完整的配置如下:
server {
# 当接收到http请求时,首先host和这里的server_name进行匹配,如果匹配上,则走这个虚拟主机的location路由
listen 80;
server_name 192.168.25.35;
# 静态资源则路由到这里
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
alias html;
}
# 其他的url则转发到 http://192.168.25.35:8080
location / {
proxy_pass http://192.168.25.35:8080;
}
}
注意:root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
1、root的处理结果是:root路径+location路径
2、alias的处理结果是:使用alias路径替换location路径