linux项目部署学习(3) -nginx/部署django项目crm

4.nginx

为什么要用nginx uwsgi?

1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,

2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,

如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况

1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。

2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。

nginx安装

需要装2个虚拟机
nginx 官方nginx
tenginx 淘宝nginx
这两个一模一样,淘宝的nginx,官方文档更详细
注意,编译软件之前,还是要解决系统的开发环境,例如如下,
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

1.进入淘宝的nginx官网,下载源代码,进行编译安装
	http://tengine.taobao.org/index_cn.html
2.在linux的opt目录下,下载nginx源代码
	wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
3.解压缩源代码,准备编译三部曲
tar -xzvf tengine-2.3.2.tar.gz
4.进入源码目录,指定nginx的安装位置
./configure --prefix=/opt/tngx232/
5.编译且安装,生成nginx的可执行命令目录
make && make install
6.安装后,会生成/opt/tngx232/目录,nginx可以使用的配置都在这里了,
conf 存放*.conf配置文件的 
html 存档网页的静态文件的目录 
logs 日志 
sbin 存放nginx的可执行命令

7.添加nginx到PATH中,可以快捷的执行命令
[root@VM-0-6-centos sbin]# pwd
/opt/tngx232/sbin
永久修改PATH,开机就会去读取
    vim /etc/profile
    source /etc/profile
8.首次启动nginx,注意要关闭防火墙
nginx #首次输入是直接启动,不得再次输入
nginx -s reload #平滑重启,重新读取nginx的配置文件,而不重启进程
nginx -s stop #停止nginx进程
nginx -t #检测配置文件
9.默认方位的nginx首页站点的url是
http://123.207.198.150:80/index.html

ps:如果你想删除编译安装的软件(如:nginx)
  1.删除PATH  vim /etc/profile
  2.删除编译安装后的软件包即可

安装完成后检测服务

netstat -tunlp |grep 80   #默认80端口
curl -I ip
#如果访问不了,检查selinux,iptables

nginx目录结构

conf 存放nginx所有配置文件的目录,主要nginx.conf
html 存放nginx默认站点的目录,如index.html、error.html等
logs 存放nginx默认日志的目录,如error.log access.log
sbin 存放nginx主命令的目录,sbin/nginx

nginx的web站点功能

也称为nginx的虚拟主机站点配置

指的就是在nginx中,能够通过文件目录的不同,分割出不同的网站

1.如何修改nginx的首页内容 
[root@VM-0-6-centos html]# ls
vi index.html
2.设置个人站点,放一些图片
[root@VM-0-6-centos html]# ls
50x.html  55kai.jpg  index_bak.html  index.html

nginx的配置文件学习

nginx的配置文件是c语言代码风格
以; 表示每一行的配置结束

nginx.conf中 以代码块形式编写的
例如 主要的几个代码块
http{}  #里面定义了多个代码,是nginx的核心功能配置点
server{} #虚拟主机代码块,定义类网站的域名,以及首页文件名字,监听端口等功能
location{} #域名匹配代码块

配置文件详解 (选中{,按shift+5,可以找到另一个括号})

[root@VM-0-6-centos conf]# cat nginx.conf
#这里是全局作用域
user  nobody; ##Nginx进程所使用的用户
worker_processes  1;#定义nginx的工作进程,以cpu核数为准,单核写1

error_log  logs/error.log; ##Nginx错误日志存放路径
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#error_log  "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";

#pid        logs/nginx.pid; ##Nginx服务运行后产生的pid进程号,之前是通过ps -ef 获取nginx的进程id,现在把pid写到nginx的配置文件,默认会写到nginx.pid文件,后续可以获取

events {
    worker_connections  1024;   //每个worker进程支持的最大连接数
    use epool;          //事件驱动模型, epoll默认
}

#这个http区域,是nginx的核心功能区域,公共的配置定义在http{}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    include       mime.types;
    default_type  application/octet-stream;
	#打开次nginx的访问日志功能,即可查看日志
    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  logs/access.log  main;
    #access_log  "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G"  main;
	
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
	
    #nginx开启静态资源压缩,比如nginx返回磁盘的html文件特别大,里面包含了诸多的js css,图片,一个html文件达到4M大小。打开后会压缩到几百K。
    gzip  on;
	
    #提供静态资源缓存功能,第一次访问过网页之后,nginx能够让图片js等静态资源,缓存到游览器上,游览器下次访问网站,速度几乎就是秒开了。
     
    //使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
    server {
        listen       80; //监听端口, 默认80
        server_name  localhost; //提供服务的域名或主机名
        access_log host.access.log;  //访问日志
        charset utf-8;
		 //控制网站访问路径,所有的请求都会进入到这里
        location / {
            root   html; //存放网站代码路径
            index  index.html index.htm;  //服务器返回的默认页面文件
        }
		//指定错误代码,去上面指定的html路径下找404.html, 统一定义错误页面, 错误代码重定向到新的Locaiton
        error_page  404              /404.html;
    	
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

 	//第二个虚拟主机配置
    server {
    ...
    }
    include /etc/nginx/conf.d/*.conf;  //包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
}//http层结束

nginx的多站点功能(多虚拟主机)

  • 基于域名的多虚拟机

    • 修改hosts文件,强制写入域名对应关系
      

  • 基于端口的多虚拟机

    • 修改nginx.conf配置文件,定义2个server{listen xx }即可
      
    • [root@VM-0-6-centos opt]# nginx -t 
      nginx: the configuration file /opt/tngx232//conf/nginx.conf syntax is ok
      nginx: configuration file /opt/tngx232//conf/nginx.conf test is successful
      
    • nginx -s reload #平滑重启
      

Nginx状态信息(status)配置

Nginx状态信息(status)配置及信息详解
    nginx与php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。为了后续的zabbix监控,我们需要先了解一下nginx的状态页。

Nginx状态信息(status)介绍
    Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态。
要想使用状态模块,在编译时必须增加--with-http_stub_status_module参数。

监测你的nginx是否安装了status模块

[root@master conf]# /opt/nginx/sbin/nginx -V
nginx version: nginx/1.12.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
configure arguments: --prefix=/opt/nginx/ --with-http_stub_status_module

启动status状态功能,修改配置文件

#在访问ip/status的时候,进入状态功能        
location /status {        
			#开启nginx状态功能
             stub_status on;
}            

平滑重启nginx

nginx -s reload

访问status页面

http://192.168.119.10/status

通过ab压测命令检测

yum -y install httpd-tools

-n requests #执行的请求数,即一共发起多少请求。

-c concurrency #请求并发数。

-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。

ab -kc 1000 -n 100000 http://192.168.119.10/

status页面解析

img

nginx的404优化

 1.在nginx的配置文件中加error_page参数
        location / {
            root   html; //存放网站代码路径
            index  index.html index.htm;  //服务器返回的默认页面文件
        }
		//指定错误代码,去上面指定的html路径下找404.html, 统一定义错误页面, 错误代码重定向到新的Locaiton
        error_page  404              /404.html;
2.nginx -t 
3.nginx -s reload

nginx的访客日志

nginx的访客日志,能够记录分析用户的请求行为
-什么时间点,访问的最频繁,比如路飞的网站,网站的流量,基本都在晚上
-记录用户的请求频率,以此检测是否爬虫等恶意请求,进行封禁
-检测躲在代理ip后的 真实的用户ip
-检测用户ip 请求时间 请求url等

如何配置?

#打开次nginx的访问日志功能,即可查看日志
#记录日志的格式,可定义多种格式
    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  logs/access.log  main;#指定日志文件的路径以及格式

对应参数解析

$remote_addr    记录客户端ip
$remote_user    远程用户,没有就是 “-”
$time_local    对应[14/Aug/2018:18:46:52 +0800]
$request     对应请求信息"GET /favicon.ico HTTP/1.1"
$status      状态码
$body_bytes_sent  571字节 请求体的大小
$http_referer  对应“-”  由于是直接输入浏览器就是 -
$http_user_agent  客户端身份信息,用此nginx可以判断,客户端是手机游览器,还是pc的客户端,转发给相对应的界面。
$http_x_forwarded_for  记录客户端的来源真实ip 97.64.34.118
访客日志信息:
120.244.48.91 - - [28/Jun/2020:16:09:16 +0800] "GET /js/jquery.min.js HTTP/1.1" 404 203 "http://123.207.198.150/121" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"

nginx限制网站来源IP访问

如果哪天发现你的nginx很慢,或者检查access.log时候,有一个some body疯狂请求你的nginx server,那么可以禁止这个IP访问
限制ip或ip段访问
禁止访问/av/底下的资源

location /av {
deny 122.71.240.254;
#alias /opt/nginx1-12/html/av;
allow 10.1.1.0/16;  
}

nginx的反向代理与负载均衡

正向代理

正向代理,也就是传说中的代理,他的工作原理就像一个跳板(VPN),简单的说:

我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

反向代理

对于客户端而言,代理服务器就像是原始服务器。

nginx实现负载均衡的组件

ngx_http_proxy_module    proxy代理模块,用于把请求抛给服务器节点或者upstream服务器池

实现一个简单的反向代理

机器准备,两台服务器

master  xxxx  主负载
slave   xxx  web1

由于只有一台服务器,所以下面利用nginx的多虚拟主机功能实现反向代理

    upstream proxy_85_90{
        server http://123.207.198.150:85;
        server http://123.207.198.150:90;
        }

server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://proxy_85_90;
            #root   index;

    #gzip  on;
    upstream proxy_85_90{
        server 123.207.198.150:85;
        server 123.207.198.150:90;
        }

server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://proxy_85_90;
            #root   index;
            #index  index.html index.htm;
        }
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
}

server {
        listen       85;
        server_name  localhost;
        location / {
            root   /opt/tngx232/html/python85;
            index  index.html index.htm;
        }
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
}


nginx负载均衡算法

    #负载均衡配置
    upstream jh.w3cschool.cn {
     
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        #nginx的upstream目前支持4种方式的分配
        #1、轮询(默认)
        #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
        #2、weight
        #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2、ip_hash
        #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3、fair(第三方)
        #按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4、url_hash(第三方)
        #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
        #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend{#定义负载均衡设备的Ip及设备状态}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用负载均衡的server中增加 proxy_pass http://bakend/;

        #每个设备的状态设置为:
        #1.down表示单前的server暂时不参与负载
        #2.weight为weight越大,负载的权重就越大。
        #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
        #4.fail_timeout:max_fails次失败后,暂停的时间。
        #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

        #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
        #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
        #client_body_temp_path设置记录文件的目录 可以设置最多3层目录
        #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
    }
     

5.正式发布python-web crm项目

参考 : https://www.cnblogs.com/pyyu/p/9842878.html

nginx有关uwsgi模块介绍

http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

发布CRM你将使用以下软件

  • nginx
  • uWSGI
  • CentOS7
  • CRM项目文件
  • virtualenv
  • supervisor

1.配置启动uwsgi.ini,启动uwsgi时候,用这个配置文件启动(用的unix-socket连接的nginx和uwsgi)

(venv) [root@yugo /data 11:14:25]#cat uwsgi.ini
[uwsgi]
#使用nginx连接时使用
socket=0.0.0.0:8000
#不用nginx直接当做web服务器使用
#http=0.0.0.0:9000
#项目目录绝对路径
chdir=/data/Ace_crm
#wsgi文件路径,在项目底下
wsgi-file=Ace_crm/wsgi.py
#指定解释器目录
home=/data/venv
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log

2.修改nginx.conf文件,请求转发给后台

server {
        listen       80;
        server_name   localhost;
    	charset		  utf-8;
    	error_page  404  /40x.html;
    	#这里是location路径匹配,如果你写的是root参数,就是一个web站点功能
    	#基于uwsgi协议的一个高性能的反向代理转发,新的参数
        location / {
			#请求发给80端口时,通过uwsgi_pass把请求转发给后端的uwsgi服务器
            uwsgi_pass  0.0.0.0:8000;
            #这个参数时固定的,时添加一些转发请求内容
            include uwsgi_params;  #一些头文件
        }
    
}

3.supervisor启动uwsgi和django,以及重启nginx

注意:要先杀死supervisord/uwsgi  
    ps -ef | grep supervisor
    ps -ef | grep uwsgi
    kill -9 28566
    pkill -9 uwsgi

在重启

supervisord -c /etc/supervisord.conf
nginx -s reload 

4.还得配置nginx接受所有的django的静态资源文件(让nginx去处理静态文件html css,不经过后端django)

nginx找到crm的静态文件的原理图

1.修改django中settings.py
	STATIC_ROOT='/S25static/' #定义一个统一管理的目录,收集所有的crm静态文件
2.用命令收集静态文件(注意:要是创建了虚拟环境,肯定要激活虚拟环境执行命令的)
	python3 manage.py collectstatic
3.通过nginx去找到如下的静态资源即可

此时nginx.conf的配置

server {
        listen       80;
        server_name   localhost;
    	charset		  utf-8;
    	error_page  404  /40x.html;
    	#这里是location路径匹配,如果你写的是root参数,就是一个web站点功能
    	#基于uwsgi协议的一个高性能的反向代理转发,新的参数
        location / {
			#请求发给80端口时,通过uwsgi_pass把请求转发给后端的uwsgi服务器
            uwsgi_pass  0.0.0.0:8000;
            #这个参数时固定的,时添加一些转发请求内容
            include uwsgi_params;  #一些头文件
        }
    	#对静态文件的匹配可以这么写
    	#当请求进来时(192.168.178.143/static/css),告诉nginx去linux的/s25static目录下去找文件。
    	location /static {
            alias /s25static;  #alias别名的意思
        }  		
}

这样访问网站就可以看到界面了(默认http 80端口),nginx静态文件自己处理,动态的需要访问数据库的,nginx转发到8000端口,给后端处理。

posted @ 2020-06-28 21:34  hanfe1  阅读(382)  评论(0编辑  收藏  举报