nginx 概述

1. Nginx作用
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝

1. 服务器
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数

2. 正向代理
作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理

3. 反向代理
我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址

4. 负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

5. 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力

2. Nginx安装
2.1 windows 安装
安装解压

安装网址: http://nginx.org/en/download.html

直接下载 nginx-120.2.zip。
下载后解压,解压后如下: (路径不要带中文名)

验证

打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe ,回车即可

直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!

至于为什么是 80 端口, nginx 的配置文件是 conf 目录下的 nginx.conf,conf/nginx.conf 中默认配置的监听的端口为80

如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!

2.2 Linux 安装
嗷呜, 或许在某一天部署博客的时候再写 ~ ~ ~

3. 操作命令
# 启动nginx, 需要在安装的根目录
$ nginx

# 关闭nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
## 快速停止nginx
$ nginx -s stop
## 完整有序的停止nginx
$ nginx -s quit
## 使用taskkill
## taskkill是用来终止进程的, /f是强制终止 . /t终止指定的进程和任何由此启动的子进程。 /im示指定的进程名称
$ taskkill /f /t /im nginx.exe

# 重新加载配置文件
$ nginx -s reload  

# 查看nginx进程
$ ps aux|grep nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4. 配置文件
配置文件中有很多以 #开头 的表示注释内容, 可以忽视,精简完是这个样子

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 {
            root   html;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
4.1 全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令

主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等

#运行用户,若编译时未指定则默认为 nobody
user nobody;

# 这是 Nginx 服务器并发处理服务的关键配置
# worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
#工作进程数量,可配置成服务器内核数 * 2
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
1
2
3
4
5
6
7
8
9
10
11
12
13
4.2 events 块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

events {
    # 表示每个 work process 支持的最大连接数为 1024.
    worker_connections  1024;
}
1
2
3
4
4.3 配置块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

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;
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
需要注意的是:http块也可以包括 http全局块、server块。

http 全局块

http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

# 文件扩展名与文件类型映射表
include       mime.types;
# 默认文件类型
default_type  application/octet-stream;
# 支持文件下载 
sendfile    on;
# keepalive_timeout  0;
keepalive.timeout  65;
# gzip模块设置,设置是否开启gzip压缩输出
gzip   on; 
1
2
3
4
5
6
7
8
9
10
server 块

http块可以包括多个 server块,而每个 server块就相当于一个虚拟主机, 可以同时包含多个 locaton块。

# IP地址和端口 或 ip地址 或 主机名
# 只有ip地址,默认端口是80
listen       3000;
# listen       *:80;
# listen       127.0.0.1:80;
# listen       127.0.0.1;
# listen       localhost:80;
# listen       localhost;

# 服务器名字
# 可以是多个,根据请求中的HOST字段,可以匹配特定的server块
server_name  localhost;

# 网页的默认字符集
# charset koi8-r;

#access_log  logs/host.access.log  main;

# 根据请求的URI,配置不同的处理,相当于路由
# 可以为特定的字符串或者一个正则表达式
# nginx优先检查特定字符串,并且采用匹配到最长的字符串定义的location,根据正则表达式在配置文件出现的先后顺序检查
# 如果没有匹配到正则表达式,则使用之前的location
# =    严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
# ~    区分大小写匹配(可用正则表达式)
# ~*   不区分大小写匹配(可用正则表达式)
# !~   区分大小写不匹配
# !~*  不区分大小写不匹配
# ^~   如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
location / {
    # nginx目录下的目录
    # 网站根目录的位置/usr/local/nginx/html
    root   html;
    # 跳转的页面
    # 默认首页文件名
    index  1.html;
    # 根据特定location中匹配到的URI,设置被代理的虚拟服务器协议和地址。http或者https协议必须要有,地址可以是具体的域名或者ip地址(端口号可有可无)
    # proxy_pass   http://127.0.0.1;
}

error_page   500 502 503 504  /50x.html;

deny 127.0.0.1;            #拒绝的 ip
allow 172.18.5.54;        #允许的 ip  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
https service

https server
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;
   }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
5. 反向代理
实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中

通过 http://localhost:8080/serve1 来获取 http://localhost:3000/serve1的地址

通过 http://localhost:8080/serve2 来获取 http://localhost:4000/serve2的地址

隐藏了原主机的ip地址

const express = require('express');
const app = express();
const port = 4000;

app.get('/serve2', (req, res) => {
    res.send('Hello serve2 World!');
})

app.get('/serve2/test', (req, res) => {
    res.send('Hello serve2 test!');
})

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


const express = require('express');
const app = express();
const port = 3000;

app.get('/serve1', (req, res) => {
    res.send('Hello serve1 World!');
})

app.get('/serve1/test', (req, res) => {
    res.send('Hello serve1 test!');
})

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


nginx 中 location的proxy_pass配置了 对 serve1 以及 serve2 url的代理地址

server {
    listen       8080;
    server_name  localhost;

    location /serve1/ {
          proxy_pass http://127.0.0.1:3000;
    }

    location /serve2/ {
          proxy_pass http://127.0.0.1:4000;
    }

    error_page   500 502 503 504  /50x.html;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

6. 负载均衡
浏览器地址栏输入地址 http://localhost/serve1,负载均衡效果,平均 8081 和 8082 端口中

两个服务器开启同样的返回值,主要是更改 nginx 的配置

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    upstream myserver {
        server localhost:3000;
        server localhost:4000;
    }

    server {
        listen       8080;
        server_name  localhost;
        location /serve1/ {
            proxy_pass http://myserver;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page   500 502 503 504  /50x.html;
    }

    include servers/*;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
默认情况下每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除

也可以通过服务器访问的权来决定,weight 代表权重, 默认为 1,权重越高被分配的客户端越多

upstream myserver {
    server localhost:3000 weight=1;
    server localhost:4000 weight=2;
}
1
2
3
4
ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器

upstream myserver {
    ip_hash;                            //  在这儿
    server localhost:3000;
    server localhost:4000];
}
1
2
3
4
5
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver {   
    server localhost:3000;
    server localhost:4000];
    fair;
}
1
2
3
4
5
7. 动静分离
请求来的时候,静态资源从专门的静态资源服务器获取,动态资源还是转发到后端服务器上

server {
    listen       8080;
    server_name  localhost;
    location /serve1/ {
        # 文件根目录
        root   /usr/local/etc/nginx/data;
    }
    location /serve2/ {
        root   /usr/local/etc/nginx/data;
        # 开启可以可以现实文件目录(默认不可以)
        autoindex on;
    }

    error_page   500 502 503 504  /50x.html;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


8. root与alias
alias 实际访问文件路径不会拼接URL中的路径

root 实际访问文件路径会拼接URL中的路径

# 访问http://localhost/sta/sta1.html
# 实际访问:/usr/local/nginx/html/static/sta1.html 文件
location ^~ /sta/ {  
   alias /usr/local/nginx/html/static/;  
}

# 请求:http://localhost/tea/tea1.html
# 实际访问:/usr/local/nginx/html/tea/tea1.html 文件
ocation ^~ /tea/ {  
   root /usr/local/nginx/html/;  
}
1
2
3
4
5
6
7
8
9
10
11
9. location
= 表示精确匹配,优先级最高,匹配成功后则停止向下搜索。

# 精确匹配,必须是127.0.0.1/
location = / {
  ...
}
# 精确匹配,必须是127.0.0.1/login
location = /login {
  ...
}
1
2
3
4
5
6
7
8
^~ 对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写

## 127.0.0.1/static/js.
location ^~ /static/ {
    ...
}
1
2
3
4
~ 对 uri (可以不是起始字符)做 正则匹配,区分大小写

## 区分大小写,以gif,jpg,js结尾
location ~ \.(gif|jpg|png|js|css)$ {
    ...
}
1
2
3
4
~* 对 uri (可以不是起始字符)做 正则匹配,不区分大小写

## 不区分大小写,匹配.png结尾的
location ~* \.png$ {
    ...
}
# 匹配所有 gif jpg 或 jepg 结尾的请求
location ~* \.(gif|jpg|jpeg)$ {} 
1
2
3
4
5
6
!~ 和 !~*
分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配

## 区分大小写,匹配不以.xhtml结尾的
location !~ \.xhtml$ {
    ...
}
location !~* \.xhtml$ {
    ...
}

1
2
3
4
5
6
7
8
匹配起始于此字符串的所有uri,区分大小写,字符串匹配

# 什么都可以
# 代表已/开头,所以这条规则将匹配所有的请求  
location / {
    ...
}
1
2
3
4
5
精确匹配: = 后面的表达式中写的是纯字符串

字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串

正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式

10. https
server
{
    listen 443 ssl http2;
    server_name ximingx.org.cn;

    ssl_certificate    /www/server/panel/vhost/cert/NeteaseCloudMusicApi/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/NeteaseCloudMusicApi/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

server {
    listen 80;
    server_name ximingx.org.cn;
    rewrite ^(.*)$ https://$host$1 permanent;
}


https://blog.csdn.net/ximing020714/article/details/124656537

Nginx_nginx可以承受多大并发_ximingx的博客-CSDN博客

你可能感兴趣的:(nginx,运维,华为云,数据库,https)