Nginx

  1. 1. Nginx简介
    1. 1.1. 什么是Nginx
    2. 1.2. 为什么要用Nginx
    3. 1.3. 什么是正向代理和反向代理?
    4. 1.4. 负载均衡的理解
    5. 1.5. 为什么Nginx性能这么高
    6. 1.6. Nginx怎么处理请求的
  2. 2. Nginx常用命令
  3. 3. 在Docker容器中安装Nginx
    1. 3.1. Setup SSL with NGINX
    2. 3.2. DNS域名解析上加上blog域名
  4. 4. 参考

NGINX is open source software for web serving, reverse proxying, caching, load balancing, media streaming, and more. It started out as a web server designed for maximum performance and stability. In addition to its HTTP server capabilities, NGINX can also function as a proxy server for email (IMAP, POP3, and SMTP) and a reverse proxy and load balancer for HTTP, TCP, and UDP servers.

Nginx简介

什么是Nginx

Nginx(enginx x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发能力强特点,他可以处理2-3万并发连接数,官方监测能支持5万并发

  1. 处理静态文件, 索引文件以及自动索引,打开文件描述符缓冲
  2. 无缓存的反向代理加速,简单的负载均衡和容错.

为什么要用Nginx

  • 跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少
  • 而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上

使用Nginx的话还能:

  1. 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
  2. 稳定性高:宕机的概率非常小
  3. 接收用户请求是异步的

什么是正向代理和反向代理?

正向代理就是一个人发送一个请求直接就到达了目标的服务器(代理客户端)

例如VPN,在电脑上做了一个代理,这个代理会帮你请求外部的资源

反向代理就是请求统一被Nginx接收,nginx反向代理服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了

例如:每天大量的人访问百度,永远都是www.baidu.com这个域名,百度肯定不止一台服务器

反向代理就是代理服务器端的,让你无感知的浏览一些服务器资源,可以让服务更好的部署上线

负载均衡的理解

Nginx提供的负载均衡策略有2种:内置策略和扩展策略,内置策略为轮询,加权轮询,IP hash,扩展策略就是天马行空的感觉

请求依次循环访问服务器就是轮询

加权轮询就是加上权重

IP hash对客户端请求的IP进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享问题

动静分离:在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:CSS,HTML,JS,jpg等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变得资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,提高资源响应速度

为什么Nginx性能这么高

因为它的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

Nginx怎么处理请求的

nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址

1
2
3
4
5
6
7
8
server {                              # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
}

Nginx常用命令

1
2
3
4
5
6
cd /usr/local/nginx/sbin/
./nginx # 启动
./nginx -s stop # 停止
./nginx -s quit # 安全退出
./nginx -s reload # 重新加载配置文件
ps aux | grep nginx # 查看nginx进程

默认80端口,如果连接不上,检查服务器防火墙是否开放端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8000/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp

# 重启防火墙(修改配置后需要重启防火墙)
firewall-cmd --reload

# 参数解释
1. firewall-cmd:是linux提供的操作firewall的一个工具
2. --permanent:表示设置为持久
3. --add-port:标识添加的端口

在Docker容器中安装Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动新容器绑定80和443端口 容器名ubuntu 镜像名ubuntu1
docker run -it -p 80:80 -p 443:443 --name ubuntu ubuntu1 /bin/bash

# 更新
apt update && apt upgrade

# 安装 nano
apt install nano

# 安装 nginx
apt-get install nginx

# 运行 nginx
service nginx start

Setup SSL with NGINX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /etc/nginx/conf.d

# make a new configuration
nano blog.tyokyo320.com.conf

# make a new directory to hold nginx SSL certain key
mkdir /etc/nginx/ssl

# give it the necessary permissions for read and write
chmod 700 /etc/nginx/ssl

# 安装 openssl
apt-get install openssl

# 生成私有密钥
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/blog.key -out /etc/nginx/ssl/blog.crt

接下来编辑配置文件的内容

1
2
# modify configuration
nano blog.tyokyo320.com.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server{
listen 80 default_server;
server_name blog.tyokyo320.com;
return 301 https://$server_name$request_uri;


}

server{
listen 443 ssl;
server_name blog.tyokyo320.com;

# ssl_certificate -- Specifies public key
ssl_certificate /etc/nginx/ssl/blog.crt;
# ssl_certificate_key -- Specifies private key
ssl_certificate_key /etc/nginx/ssl/blog.key;

location / {
root /usr/share/nginx/html;
index index.html index.html;
}

}

这里需要将/etc/nginx/conf.d中的blog.tyokyo320.com.conf移动到/etc/nginx/sites-available

1
2
# 当前路径 /etc/nginx/sites-available
mv ../conf.d/blog.tyokyo320.com.conf .

然后备份sites-available下的default文件

1
mv default default.bak

再删除/etc/nginx/sites-enabled下的default链接文件

1
2
# 当前路径 /etc/nginx/sites-available
rm ../sites-enabled/default

最后在sites-enabled建立一个blog.tyokyo320.com.conf的软链接

1
2
# 当前路径 /etc/nginx/sites-enabled
ln -s ../sites-available/blog.tyokyo320.com.conf .

执行结果

1
2
3
root@5602de98f6a6:/etc/nginx/sites-enabled# ls -l
total 0
lrwxrwxrwx 1 root root 42 Sep 11 06:46 blog.tyokyo320.com.conf -> ../sites-available/blog.tyokyo320.com.conf

最后检查一下配置文件是否成功

1
2
3
root@5602de98f6a6:/etc/nginx/sites-enabled# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

成功的话可以reload了

1
nginx -s reload

退出容器返回NUC,编辑~/docker/frp/frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[common]
server_addr = 3.19.55.120
server_port = 7000

[ssh]
type = tcp
local_ip = 172.17.0.1
local_port = 22
remote_port = 6000

[blog_http]
type = tcp
local_ip = 172.17.0.1
local_port = 80
remote_port = 80
custom_domains = blog.tyokyo320.com

[blog_https]
type = tcp
local_ip = 172.17.0.1
local_port = 443
remote_port = 443
custom_domains = blog.tyokyo320.com

DNS域名解析上加上blog域名

参考