• linux项目部署学习(3) -nginx/发布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端口,给后端处理。

  • 相关阅读:
    WebRTC的一个例子
    Gerrit增加SSL证书
    Ruby on Rails 创建https应用
    使用Ruby来实现批量更新AD中字段
    pg gem 安装(postgresql94)
    Spark源码剖析(一):如何将spark源码导入到IDEA中
    Scala入门系列(十三):类型参数
    Scala入门系列(十二):隐式转换
    Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
    Scala入门系列(十一):模式匹配
  • 原文地址:https://www.cnblogs.com/hanfe1/p/13205158.html
Copyright © 2020-2023  润新知