Nginx学习

基础操作

安装 :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
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值