基础操作
安装 :yum -y install install nginx
查看版本: nginx -v
启动 : sudo nginx # 启动浏览器,输入服务器地址,看见Welcome to Nginx则说明安装成功
快速停止:sudo nginx -s stop # -s 表示往nginx里发送信号
退出:sudo nginx -s quit # 比stop 优雅
重新加载配置文件 : sudo nginx -s reload
重新打开日志文件 : sudo nginx -s reopen
配置目录
cd /etc/nginx
配置模块
events 配置域 :网络连接相关配置(I/O模型等)
server配置域 : 相关节点配置
location配置域 : 资源路由配置
http配置域:Nginx作为网页服务器时的配置
同级有一个mail控制域,负责邮件相关配置
upstream配置域 : 反向代理配置域
配置域之间的层级关系
events{
# 顶级配置域
}
http{
upstream{
...
}
server{
location{
...
}
}
}
mail{
}
[root@VM_0_9_centos nginx]# vim nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx; # 用户
worker_processes auto; # 工作进程 自动
error_log /var/log/nginx/error.log; # log地址
pid /run/nginx.pid; # 进程所在地
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; # 包含/usr/share/nginx/modules/下的所有配置文件
events {
worker_connections 1024; # 每个进程处理最大连接数
}
http {
...
include /etc/nginx/conf.d/*.conf;
server {}
}
WSGI & ASGI & uWSGI
WSGI(仅为一种通信规范)
Python Web Server Gateway Interface:为Python语言定义的Web服务器和Web应用程序框架之间的之中简单、通用的接口
# 部署由http协议的Django应用时,最典型的使用
只用到了 http 和http2
Web服务器 协议(服务应用) Web应用程序框架
Ngix代理/Apache + WSGI(uWSGI) + Django/Flask
ASGI
Asynchronous Server Gateway Interface:异步服务网关接口,介于网络协议服务和python应用之间的标准接口,能够处理多种通用协议类型,包括http、http2、websocket
Ngix代理/Apache + ASGI(Daphne) + Django/Flask
-
WSGI和ASGI区别:
WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI就是为了支持Python常用的WSGI所不支持的新协议标准,即ASGI是WSGI的扩展,而且能asyncio异步运行
uWSGI
- 实现WSGI协议
- 是一个Web服务器
- 接收客户端请求,通过协议传送给Django应用
uWSGI安装域基本配置
安装 : pip3 install uWSGI
chdir :指定WSGI应用目录
module :指定WSGI应用模块的名字
processes : uWSGI进程数
(http-)socket : 套接字路径、地址
max-requests : 最大并发请求数
vacuum : 清理环境配置(Boolean 默认为True)
-
启动uwsgi服务示例
Linux下命令行方式: uwsgi --chidr xxx --socket :80 --max-requests 5000 --processes 4 --module xxx.wsgi
配置文件方式: vim uwsgi-demo.ini [uwsgi] chidr = /xxxx/xx http-socket = :80 max-requests = 5000 module = xxx.wsgi # 启动指令 uwsgi --ini uwsgi-demo.ini
为什么需要uWSGI部署Django项目?
Django runserver 可以很直接对外服务,但只适用于测试
uWSGI可以进行多进程调度、进行监控
uWSGI提供完善的请求日志处理
-
Demo,打通uwsgi <-> client <-> python应用
# Linux下 mkdir deployment cd deployment touch uwsgi_test.py vim uwsgi_test.py
#!/usr/bin/env python # -*- encoding=utf-8 -*- def appliction(env,start_response): """ env : 环境变量 start_response : """ start_response("200 ok",[('Content-type','text/html')]) # 指定返回内容,注意要返回字节型字符串 return [b'hellow world, hello uwsgi']
-
启动服务
uwsgi --http :8000 --uwsgi-file uwsgi_test.py
使用浏览器访问服务器ip地址:8000 端口,可以看到返回内容,而服务可以看见log
-
Demo,将python应用变为django应用
cd deployment django startproject django_deployment cd django_deployment vim settings.py
# 运行所有ip访问 ALLOW_HOST = ["*"]
# 运行服务 看到欢迎页面即成功 python3 manage.py runserver 0.0.0.0:8000
-
启动django的uwsgi.py
# 依旧能正常访问即正常 uwsgi --http :8000 --module django_deployment.wsgi # 每次刷新浏览器,可看见浏览器后台打印log
-
将命令函配置改为文件配置
# 在 manage.py统计目录下 touch django_uwsgi.ini vim django_uwsgi.ini
[uwsgi] chdir = django_deployment.wsgi所在目录 module = django_deployment.wsgi http-socket = :8000 master = true process = 4 threads = 1 vacuum = true # 指定log配置[!!记得创建对应的log文件夹!!] daemonize = %(chdir)/log/uwsgi-8000.log # 指定log位置 # 不能设置为 1024*1024*1024,要直接设置为数值 log-maxsize = 1024000000 pidfile = %(chdir)/pid/uwsgi-8000.pid # 指定pid(进程文件)位置
-
再次启动uwsgi服务
uwsgi --ini django_uwsgi.ini
停止服务
uwsgi --stop pid/uwsgi-8000.pid
-
-
-
Django Nginx + uWSGI部署
-
为何还需要Nginx进行部署?
- 知名服务器,提供更安全的服务保障 - 提供反向代理、负载均衡等丰富功能 - 对于静态文件处理能力更强
-
实现步骤
Step1 - uwsgi启动Django服务 Step2 - 修改Nginx配置文件,完成反向代理配置 Step3 - 收集静态文件,完成讲台文件寻址配置
Step1 - uwsgi启动Django服务 uwsgi --ini django_uwsgi.ini cat pid/uwsgi-8000.pid # 查看pid进程文件 ps -aux | grep 13290 # 查看进程相关信息
Step2 - 修改Nginx配置文件,完成反向代理配置 cd /etc/nginx/ sudo su # 该文件夹需要root权限,所有切换为root用户 cp nginx.conf nginx-uwsgi.conf # 复制一份配置文件 vim nginx-uwsgi.conf
# vim nginx-uwsgi.conf中 http{ ... # 反向代理配置域 名字为uwsgi upstream uwsgi{ # 指定具体地址 server 127.0.0.1:8000 } # 创建server节点 server{ listen 80; # 监听80端口,没有域名即在后面添加 default server # server name : .xxxx.xxx.com #域名需要在服务器运营商处配置, . 表示所有域名都映射到此 charset utf-8; access_log /var/log/nginx/nginx-wusgi.log # 具体服务节点,进行转发 location / { # 意为 server name : .xxxx.xxx.com下 80端口的所有请求都转发到 # 上面自定义的upstream uwsgi地址 proxy_pass http://uwsgi; } # 收集完静态文件后配置 location /static { alias 静态文件目录eg:home/xxx/xxx/xxx/static; } } }
-
静态文件收集
进入项目文件 settings.py中 指定静态文件目录 : STATIC_ROOT = OS.PATH.JOIN(BASE_DIR,'static/') # 使用指令收集静态文件 python manage.py collectstatic # cd /etc/nginx 配置nginx.conf
-
Django https配置
-
认识HTTPS
HTTPS 使用SSL协议加密保温传输内容 使用443端口 耗费CPU资源与计算时间
-
申请SSL证书
云厂商提供个人免费证书申请 个人免费版证书仅支持一个域名或子域名 验证SSL证书绑定域名的有效性
在/etc/nginx/ 目录下创建ssl目录 将证书中压缩包中 ssl/申请域名/nginx/ 下 域名.crt & 域名.key 同步进去
cp nginx-wusgi.conf nginx-wusgi-https.conf # 复制一份配置文件用以区分 vim nginx-wusgi-https.conf
# nginx-wusgi-https.conf # 将80端口转发到443安全端口 server { listen 80; server_name .xxxx.com; return 301 https://{域名}.com$request_url; # 301 表示为重定向状态码 } server{ # 将端口改为443 listen 443 ssl; # 添加域名crt 与key ssl_certificate /etc/nginx/ssl/xxxx.com.crt; ssl_certificate_key /etc/ssl/nginx/xxxx.com.key; # 定义协议 可以从上方nginx默认定义中copy ssl_protocols TLSV1 TLSV1.1 TLSV1.2 } # 使用浏览器输入网址 https://{域名}.com:443
Nginx配置高可用(故障自动切换)
/etc/nginx/设置两个进程
cp django_uwsgi.ini django_uwsig_8001.ini # 复制两个配置文件
cp django_uwsgi.ini django_uwsig_8002.ini
分别将端口、log、进程设置为 8001,8002,并将processes 下调为1(资源有限)
分别启动8001与8002端口
uwsgi --ini django_uwsig_8001.ini
uwsgi --ini django_uwsig_8002.ini
cp nginx-uwsgi-https.conf nginx-uwsgi-https-HA.conf
vim nginx-uwsgi-https-HA.conf
-
# nginx-uwsgi-https-HA.conf # 将upstream uwsgi改为2个server upstream uwsgi{ server 127.0.0.1:8001; server 127.0.0.1:8002; }
nginx -s reload
# 实时查看log
sudo tail -f uwsgi-8002.log
# 模拟停止一个进程 停止8002
uwsgi --stop pid/uwsgi-8002.pid
ps -aux | grep uwsgi # 查看相关进程
# 使用浏览器再次访问服务器(能正常访问)
-
Nginx负载均衡
# 将upstream uwsgi 在server后添加权重 upstream uwsgi{ server 127.0.0.1:8001 weight=3; server 127.0.0.1:8002 weight=1; }
注意事项
- 不要用root权限启动uWSGI服务
- 关闭uWSGI外网访问
- 将http-socket = :8001,改为127.0.0.1:8001。则实现外网屏蔽
Unix套接字
- 进程间通信(IPC) 的一种方法
- 可靠且时POSIX标准的一个组件
- 只能用古同一主机间的通信
-
传统nginx-uWSGI之间通信需要经过多层tcp/ip协议,占用资源
-
修改相关配置
# 项目目录下 cp django-uwsgi.ini django-uwsgi-sock.ini vim django-uwsgi-sock.ini 注释掉: http-socket = :8001 改为: socket = django.sock 重新运行 uwsgi --ini django-uwsgi-sock.ini 文件夹中会多出一个django.sock 文件 修改权限让 nginx能够使用 : chmod 777 django.sock
# /etc/nginx/ cd /etc/nginx/ sudo su # 切换为root权限 修改配置文件: # 在此行下添加 include /usr/share/nginx/modules/*.conf; # 引入uwsgi_params include /etc/nginx/uwsgi_params; upstream uwsgi{ # 注释掉 : server 127.0.0.1:8000 改为: # eg: server unix:///home/ubuntu/xxx/xxx/django.sock server unix://{/django项目目录下的django.sock文件} } server { ... location{ # 注释掉 proxy_pass http://uwsgi; 改为uwsgi转发 uwsgi_pass uwsgi; } } nginx -s reload # 重新加载 访问服务器,能正常加载则pass