nginx
高性能的HTTP服务器和反向代理服务器
在django项目部署时一般使用nginx和其他服务器一起搭配使用,nginx用来处理静态资源文件
此处为ubuntu安装流程:
按照官方文档执行安装,顺序执行下列命令:
安装
安装前置
sudo yum install curl gnupg2 ca-certificates lsb-release
要為穩定的nginx軟件包設置apt倉庫
echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
使用主線nginx軟件包时,使用下面的命令
echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
設置存储位置以使我們的軟件包優先於發行版提供的軟件包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
導入一個官方的nginx簽名密鑰,以便apt可以驗證軟件包的真實性。獲取密鑰
curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key
驗證下載的文件包含正確的密鑰
gpg --dry-run --quiet --import --import-options show-only /tmp/nginx_signing.key
注意:在Ubuntu 16.04上,請改用以下命令:
gpg --with-fingerprint /tmp/nginx_signing.key
輸出應包含完整的指紋 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 ,如下所示
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
最後,將密鑰移動到apt可信密鑰存儲區(請注意“ asc”文件擴展名更改)
sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc
安裝nginx,運行以下命令:
sudo apt update
sudo apt install nginx
nginx控制——系统指令 | |
---|---|
systemctl enable nginx | 设置开机自启 |
systemctl start nginx | 启动nginx服务 |
systemctl status nginx | 查看nginx状态 |
systemctl stop nginx | 关闭nginx服务 |
systemctl disable nginx | 禁止开机自启 |
一般不建议使用linux中的系统指令来控制nginx服务器,因为在使用系统指令时无法传递参数
ngiunx有自带的命令来控制nginx服务器
指令 | |
---|---|
nginx -t | 不运行,仅测试配置文件 |
nginx -c configpath | 从指令路径加载配置文件,启动nginx |
nginx -t -c configpath | 测试指定配置文件 |
nginx -v | 查看版本 |
nginx -V | 查看所有的配置信息 |
nginx -s singal | 给一个 nginx 主进程发送信号:stop(停止), quit(退出), reopen(重启), reload(重新加载配置文件) |
---|---|
stop | 快速关闭 |
quit | 优雅关闭 |
reload | 重新加载配置 |
nginx的配置:
nginx配置文件包含指定指令控制的模块
指令分为简单指令和块指令
一个简单指令由名称和参数组成,以空格分隔,并以分号结尾
一个块指令和简单指令具有相同的结构,但不是以分号结束,而是以一个大括号包围的一堆附加指令结束
如果一个大括号内可以有其他的指令他就被称为一个上下文,
例如:(events, http, server, location)
格式
格式类似于JSON
分为指令和块指令
指令就是 key value ,单value可能是多个
块指令 key {},value是大括号没有分号
main # 全局设置
events{ # 指定工作模式以及连接上限
use epoll;
worker_connections 1024;
}
use 指定nginx工作模式
epoll 高效工作模式,linux
kqueque 高效工作模式,bsd
poll 标准模式
select 标准模式
worker_connections定义nginx每个进程的最大连接数,一般根据cpu的核心数来指定
正向代理 连接数*进程数
反向代理 连接数*进程数/4
linux系统限制最多能同时打开65535个文件,默认上限就是65535,可解除 ulimit -n 65535
http # http的配置
upstream # 负载均衡配置
service # 主机设置
location # url路由匹配
使用nginx和runserver对接时的配置
server {
listen 80;
server_name localhost;
# 配置项目根目录位置
root /var/www/GP1AXF;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
# 匹配静态资源地址,以static开头的
location /static {
# alias 使用别名访问此路径时会将请求路径切割,并与定义的别名拼接
alias /var/www/GP1AXF/static;
}
# 和django的runserver对接的url配置
location / {
proxy_pass http://127.0.0.1:8000;
}
}
nginx反向代理的配置:
proxy_pass URL | 反向代理转发地址,默认不转发header,需要转发header则设置proxy_set_header HOST $host; |
proxy_method POST | 转发的方法名 |
proxy_hide_header Cache-Control | 指定头部不被转发 |
proxy_pass_header Cache-Control | 设置哪些头部转发 |
proxy_pass_request_header on | 设置转发http请求头 |
proxy_pass_request_body on | 设置转发请求体 |
负载均衡
负载均衡模块,通过一个简单的调度算法来实现客户ip到后端服务器的负载平衡
写法:
upstream myproject {
ip hash; # 指定负载均衡分发的规则
# 指定负载均衡的服务器
server 127.0.0.1:8000
server 127.0.0.1:8001 down;
server 127.0.0.1:8002 weight=3;
server 127.0.0.1:8003 backup;
}
负载均衡算法:
weight 负载权重
down 当前server不参与负载均衡
backup 其他机器全down掉或满载使用此服务
ip_hash 按每个请求的hash结果分配
fair 按后端响应时间来分(第三方的)