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博客