datetime:2022-01-08 14:34:00
author:nzb
Nginx
该文档由
html2text
生成,二次编辑的
简介
高性能
web服务器
反向代理服务器
占用内存少
高并发处理強
正向代理和反向代理
正向代理
以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端
反向代理
正向代理类似一个跳板机,代理访问外部资源,比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,他能访问那个我不能访问的网站 ,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。例子:VPN
配置文件详解
#
: 表示配置文件中默认关闭
#
user nobody;
配置worker进程用户,主进程master是root,nobody也是一个Linux用户,一般用于启动程序,没有密码
worker_processes auto;
工作进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU数量(建议跟CPU的核数量一致)
error_log /var/log/nginx/error.log;
配置全局错误日志级类型,【debug | info | notice | warn | error | crit 】,默认是error
# error_log /var/log/nginx/error.log notice;
# error_log /var/log/nginx/error.log info;
pid /run/nginx.pid;
配置进程pid文件
events
events {
use epoll; # 配置工作模式(多路IO复用方式)和连接上限
worker_connections 1024; # 单进程的并发量,最大:65535 总并发=进程数*单个进程的并发量 单个进程的并发量:655535
}
http
HTTP服务器相关配置,利用它的反向代理功能提供负载均衡支持
http {
include /etc/nginx/mime.types; # 配置Nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体文件
default_type application/octet-stream; # 默认使用二进制流格式,流类型,可以理解为支持任意类型
# 配置日志格式,main是一个变量名
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # 配置access.log日志及存放路径,并使用上面定义的main日志格式
sendfile on; # 开启高效文件传输模式
tcp_nopush on; # 用sendfile传输文件时有利于改善性能
tcp_nodelay on; # 禁用Nagle来解决交互性问题
keepalive_timeout 30; # 客户端保持连接时间,单位秒
gzip on; # 开启gzip压缩输出
include /etc/nginx/conf.d/*.conf; # 包含其他配置文件,里面文件包含server虚拟主机
include /root/project/conf/*.conf; # 包含项目的Nginx配置文件
server{
# 配置虚拟主机,一个http里面可以有多个(server_name和listen不能完全一样),可以写在conf.d目录下,包含进来
listen 80; # 配置监听端口,默认端口80
server_name localhost; # 配置服务名,域名解析
root /root/project/www; # 网站根目录
charset koi8-r; # 配置字符集
access_log /root/project/logs/access.log main; # 配置本虚拟主机的访问日志
error_log /root/project/logs/error.log main;
location / {
# 默认访问页,默认的匹配斜杠“/”(根路径)的请求,当访问路径中有斜杠/,会被location匹配到并进行处理
include uwsgi_params;
uwsgi_pass 172.18.61.250:8000;
index index.html index.htm;
}
location / test { # test会拼接到root路径之后
root /opt/www; # root后面的值就是:/test中的“/”(根路径)
index index.html index.htm;
}
error_page 404; # 配置404页面
# error_page 500 502 503 504 /50x.html; # 配置50x错误页面
location /50x.html { # 精准匹配
root html;
}
}
}
主要应用
静态网站部署
包括HTML,js,css,图片等
负载均衡
硬件负载均衡
比如:F5、深信服、Array等
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高
软件负载均衡
比如:Nginx、LVS、HAProxy等
- 优点是免费开源,成本低廉
主配置
http {
# 为HTTP服务配置负载均衡
upstream www.example.com {
# 分发:IP:端口 weight 权重 max_fails失败次数 fail_timeout分发失败超时时间
server 172.18.61.250:801 weight=4;
server 172.18.61.250:802 weight=2;
server 172.18.61.250:803 weight=2;
ip_hash;
}
# 配置同一用户访问同一个web服务器(解决session丢失问题导致无法登陆和验证码验证(生成和验证不在同一台服务器))
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl;
listen [::]:443 ssl;
ssl on;
access_log /root/project/logs/access.log;
error_log /root/project/logs/error.log;
ssl_certificate root/project/conf/cert/214915882850706.pem;
ssl_certificate_key /root/project/conf/cert/214915882850706.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffering off;
proxy_pass http://www.example.com; # 跟上面的upstream后的值一样
}
}
}
其他配置
- 配置1:备份服务器
# 可以用于更新代码
upstream www.example.com {
server 172.18.61.250:801;
server 172.18.61.250:803 backup; # 其他所有的非backup服务器down掉的时候,才请求backup服务器
}
- 配置2
upstream www.example.com {
server 172.18.61.250:801;
server 172.18.61.250:803 down; # down表示当前的服务器是down状态,不参与负载均衡,基本没什么用
}
负载均衡策略
轮询(默认)
# 注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求, # 使得每个url定向到同一个后端服务器,主要应用与后端服务器为缓存时的场景下,如果后端服务器down掉,将自动删除。 # 每台服务器交替访问,需要保证服务器的性能一样,否则会出现请求堆积导致宕机。 upstream www.example.com { server 172.18.61.250:801; server 172.18.61.250:802; server 172.18.61.250:803; }
权重
# 每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。权重按服务器性能给。 upstream www.example.com { # 分发:IP:端口 weight 权重 max_fails失败次数 fail_timeout分发失败超时时间 server 172.18.61.250:801 weight=4; server 172.18.61.250:802 weight=2; server 172.18.61.250:803 weight=2; ip_hash; } # 配置同一用户访问同一个web服务器(解决session丢失问题导致无法登陆和验证码验证(生成和验证不在同一台服务器)) # 注意:不是说4个请求一次性给第一个,而是给一个后第二个请求给第二个,第三个给第三个,等等
最少连接数
# web请求会被转移到连接数最少的服务器上,当不知道服务器性能时,不过可能导致请求堆积,因为最少连接的应该性能差。 upstream www.example.com { least_conn; server 172.18.61.250:801; server 172.18.61.250:802; server 172.18.61.250:803; }
ip_hash
# ip_hash也叫ip绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话session丢失的问题。但是模完的数相同(hash碰撞),也会导致请求堆积。 # 算法:hash("124.207.55.82")% 3 # 客户端ip # 3:3台服务器 upstream www.example.com { server 172.18.61.250:801 weight=4; server 172.18.61.250:802 weight=2; server 172.18.61.250:803 weight=2; ip_hash; } # 配置同一用户访问同一个web服务器(解决session丢失问题导致无法登陆和验证码验证(生成和验证不在同一台服务器))
静态代理
图片、css、html、js等交给Nginx处理
实现
方式一:在nginx.conf的location中配置静态资源的后缀,进行拦截
- 例如:当访问静态资源,则从Linux服务器/opt/static目录下获取(举例)
location ~.*\\.(gif|jpg|png|js|css)$ { root /opt/static; } ~:正则匹配开始 .:任意字符 *:任意次数一个或多个 \:转义字符 $:匹配结尾
- 例如:当访问静态资源,则从Linux服务器/opt/static目录下获取(举例)
方式二:在nginx.conf的location中配置静态资源所在目录,进行拦截
- 例如:当访问静态资源,则从Linux服务器/opt/static目录下获取(举例)常用
location ~.*/(css|js|img|images) { # 不匹配以什么结尾,匹配目录 root /opt/static; }
- 例如:当访问静态资源,则从Linux服务器/opt/static目录下获取(举例)常用
动静分离
动态资源:如Django项目
静态资源:如图片、css、js等由Nginx服务器完成,选择Nginx是因为Nginx效率高
虚拟主机
例如:58同城
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以做多个服务器来使用,从而可以配置多个网站。
实现
方法一:基于端口的虚拟主机(一般不用,了解)
- 基于端口的虚拟主机配置,使用端口来区分
浏览器使用同一个域名 + 端口 或 同一个 ip地址 + 端口访问
server { listen 8080; server_name www.example1.com; location / { proxy_pass http://www.myweb.com; } } server { listen 9090; server_name www.example1.com; location / { proxy_pass http://www.myweb1.com; } }
方法二:基于域名的虚拟主机(掌握)
基于域名的虚拟主机是最常见的一种虚拟主机
server { listen 80; server_name www.example1.com; location / { proxy_pass http://www.myweb.com; } } server { listen 80; server_name www.example2.com; location / { proxy_pass http://www.myweb2.com; } }