Python Tornado Nginx https搭建和使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u013538542/article/details/83010279

划重点,要考的:正向代理代理的是客户端反向代理代理的是服务器

什么是正向代理?

举例子:我们想访问Google查资料用于学习,直接访问是不可行的,这时候就需要借助VPN。VPN就是一种正向代理的配置,由于你的公网IP在国内,Google的网站IP在美国,要想访问Google,就需要把你的公网IP变成美国的IP。如何做了?
就是正向代理!客户端向代理服务器发送一个请求,指定我们要连接目标代理服务器,代理服务器将目标服务器获取的数据返回给客户端,然后就能看到Google页面了。

什么是反向代理?

反向代理对客户端来说是无感知的,客户端不需要进行任何配置就可以访问。

1.反向代理可以隐藏真实的服务器IP,客户端只能看到代理服务器的IP
2.反向代理可以提高服务器的吞吐量,因为反向代理后,所有的请求都被分发给了不同的服务器去处理,代理服务器本身只负责转发

简单的配置反向代理

server {
    listen                 80;
    server_name     localhost;
location {
        proxy_pass    http://localhost:8080
}

这个 proxy_pass http://localhost:8080 就是反向代理
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

什么是负载均衡?

负载均衡就是将任何分发给不同的操作单元去处理,如:Web服务器、FTP服务器、企业关键服务器,其他服务器等等;负载均衡和反向代理需要同时使用。
Nginx默认支持三种负载均衡
(1)、简单的配置
upstream那段代码

upstream test {
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
}

server {
listen on;
server_name localhost;
location {
proxy_pass http://test;
proxy_set_header Host h o s t : host: host:server_port;
}
}

(2)、权重
Nginx在处理时看权重的高低来定分发任务给哪个服务器来处理

upstream test {
        server localhost:8080 weight=1;
        server localhost:8081 weight=9;
}

比如这里,有10次任务,有9次分发给8081,又一次分发给8080
(3)、ip_hash
ip_hash主要是确保一个客户端只被分配到一个服务器,避免了一个登录用户的session在不同服务器之间穿梭,造成了状态不一致问题。

upstream test {
        ip_hash;
        server localhost:8080 weight=1;
        server localhost:8081 weight=9;
}

(4)、fair(第三方的,需要下载安装)
按照服务器的响应时间来分配,响应时间短快的服务器优先被分配去处理。

upstream test {
        fair;
        server localhost:8080 weight=1;
        server localhost:8081 weight=9;
}

(5)、url_hash(第三方的,需要下载安装)
按照url的hash的结果来分配请求,每个请求的url指向后端的某个固定服务器,后端服务器缓存时比较有效。

upstream test {
        hash $request_uri;
        hash_method crc32;
        server localhost:8080 weight=1;
        server localhost:8081 weight=9;
}

    
    

Python Tornado Nginx搭建和使用

部署网站,配置Nginx

先说主流程

我用的服务器是CentOS,腾讯云

uname -a
Linux VM_0_11_centos 3.10.0-862.11.6.el7.x86_64

1.先通过pip安装Python Tornado

sudo pip install tornado

2.将网站上传到服务器

通过scp就可以上传了,通过下面的命令就会将你的网站的文件都上传到服务器的目录 /var/www/testsite

scp -r testsite root@your_server_ip:/var/www/testsite

3.安装supervisor用来管理程序

sudo pip install supervisor
supervisord -v #查看版本,输出为3.3.4

4.通过yum安装Nginx,然后给Nginx配置

sudo yum install nginx
nginx -v # 查看版本,输出为nginx version: nginx/1.12.2

一般网站的文件放在目录 /var/www/

假如,我们不使用nginx,在启动supervisor来监管我们的网站程序时也是可以。那可以在终端上登录服务器,然后通过curl http://127.0.0.1:8000 来访问。加上nginx服务时我们通过外网访问我们的网站了。因为supervisor仅仅是用来管理我们的应用程序进程的,它并不负责对外开放任何服务。

看下关系图

在这里插入图片描述

然后配置网站进程的监管配置

先生成一个配置文件

echo_supervisord_conf > supervisord.conf

用vi打开编辑,滑动到最底部,修改 files = relative/directory/*.inifiles = /etc/supervisor/*.conf ,并且取消前面的分号注释,上一行[include]前面的分号也要删掉

vi supervisord.conf

按ESC + :wq 保存退出
然后将 supervisord.conf 文件挪到目录 /etc/ 目录下

sudo mv supervisord.conf /etc/

然后添加网站的进程配置,在 /etc/ 下新建一个目录 supervisor,然后在 /etc/supervisor/ 目录下,新建一个配置文件 tornado.conf 。这个文件会被上面修改的那个配置文件(/etc/supervisord.conf)所读取。
tornado.confg 文件内容如下

[group:tornadoes]
programs=tornado-8000,tornado-8001,tornado-8002,tornado-8003 

[program:tornado-8000]
command=/home/centos/myenvpy3/bin/python3 /var/www/testsite/main.py --port=8000
directory=/var/www/testsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/testsite/tornado.log
loglevel=info

[program:tornado-8001]
command=/home/centos/myenvpy3/bin/python3 /var/www/testsite/main.py --port=8001
directory=/var/www/testsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/testsite/tornado.log
loglevel=info

[program:tornado-8002]
command=/home/centos/myenvpy3/bin/python3 /var/www/testsite/main.py --port=8002
directory=/var/www/testsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/testsite/tornado.log
loglevel=info

[program:tornado-8003]
command=/home/centos/myenvpy3/bin/python3 /var/www/testsite/main.py --port=8003
directory=/var/www/testsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/testsite/tornado.log
loglevel=info

其中command配置说明:
/home/centos/myenvpy3/bin/python3 表示要执行的python
/var/www/testsite/main.py --port=8000 表示你的网站主启动文件和指定启动端口

启动网站进程的监管程序

supervisord -c /etc/supervisord.conf

查看进程

ps aux | grep supervisord

查看监管的网站进程状态

supervisorctl status

输出是

tornadoes:tornado-8000           RUNNING   pid 6705, uptime 0:35:29
tornadoes:tornado-8001           RUNNING   pid 6706, uptime 0:35:29
tornadoes:tornado-8002           RUNNING   pid 6707, uptime 0:35:29
tornadoes:tornado-8003           RUNNING   pid 6708, uptime 0:35:29

更多的命令,可以看这里
常用的命令如下

sudo supervisorctl reread # 重新读取
sudo supervisorctl reload # 重新加载
sudo supervisorctl status # 查看状态

supervisorctl status # 查看程序状态
stop tornadoes:* # 关闭 tornadoes组 程序
start tornadoes:* # 启动 tornadoes组 程序
restart tornadoes:* # 重启 tornadoes组 程序
update # 重启配置文件修改过的程序

在服务器上访问网站

curl http://127.0.0.1:8000
curl http://127.0.0.1:8001
curl http://127.0.0.1:8002
curl http://127.0.0.1:8003

以上四个连接都可以访问你的网站

Nginx的配置

nginx 安装完后,会在/etc/目录下多一个nginx目录,在该 nginx 目录下,有一个 nginx.conf 文件,我们对它进行编辑

vi /etc/nginx/nginx.conf

文件要修改和添加的是

    upstream tornadoes {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

第二处

        location /static {
            root /var/www/testsite;
            if ($query_string) {
                expires max;
            }        
        }
    location / {        
        proxy_pass_header Server;        
        proxy_set_header Host $http_host;        
        proxy_redirect off;        
        proxy_set_header X-Real-IP $remote_addr;        
        proxy_set_header X-Scheme $scheme;  # 协议 http https        
        proxy_pass http://tornadoes;
    }

完整的文件如下:

# 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;
pid /run/nginx.pid;

Load dynamic modules. See /usr/share/nginx/README.dynamic.

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;

access_log  /var/log/nginx/access.log  main;

sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

include             /etc/nginx/mime.types;
default_type        application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

upstream tornadoes {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
}


server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location /static {
        root /var/www/testsite;
        if ($query_string) {
            expires max;
        }        
    }

    location / {        
        proxy_pass_header Server;        
        proxy_set_header Host $http_host;        
        proxy_redirect off;        
        proxy_set_header X-Real-IP $remote_addr;        
        proxy_set_header X-Scheme $scheme;  # 协议 http https        
        proxy_pass http://tornadoes;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

Settings for a TLS enabled server.

server {

listen 443 ssl http2 default_server;

listen [::]:443 ssl http2 default_server;

server_name _;

root /usr/share/nginx/html;

ssl_certificate “/etc/pki/nginx/server.pem”;

ssl_certificate_key “/etc/pki/nginx/private/server.key”;

ssl_session_cache shared:SSL:1m;

ssl_session_timeout 10m;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

    # 如果要开启https的话,记得开启以下这段配置
    location /static {
        root /var/www/TelabytesWebApp;
        if ($query_string) {
            expires max;
        }
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://tornadoes;
        client_max_body_size 100M;
    }

error_page 404 /404.html;

location = /40x.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

}

保存,退出

检查nginx.conf配置文件的正确性

nginx -c /etc/nginx/nginx.conf -t

会输出

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 
 

如果云服务器重启后,发生错误是:unix:///tmp/supervisor.sock refused connection

解决方案是:

sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl status
sudo service nginx restart

https://stackoverflow.com/questions/20067116/supervisorctl-error-unix-var-run-supervisord-sock-refused-connection

安装和配置参考:
https://blog.csdn.net/tichimi3375/article/details/82153171

Nginx无法启动的参考:
https://stackoverflow.com/questions/35868976/nginx-not-started-and-cant-start

https://www.telabytes.com/




以上是在一个nginx下配置一个网站站点的情况

以下是在Nginx下配置多个网站站点

1.配置多个Nginx的server

/etc/nginx/nginx.conf 里有一个重要的配置,就是 include /etc/nginx/conf.d/*.conf; 它的意思在 /etc/nginx/conf.d/ 目录下的所有文件后缀等于.conf 的都会被加载到nginx里。

假如,现在我们有两个站点 a.com 和 b.com ,那么就可以在conf.d文件夹下创建两个配置 a.conf 和 b.conf 然后里面的内容就是上面的server哪一块,比如我的a.conf 的配置是

server {
    listen        80 default_server;
    listen        [::]:80 default_server;
    server_name   a.com; # 这是你的a.com的域名
    ......
    location /static {
        root /home/baidu/www/PrintPlusPlus; # 这是你的新站点的目录路径
        if ($query_string) {
            expires max;
        }
    }
    ......
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:6000;     # 这个地址跟之前的要有区别
        client_max_body_size 100M;
    }
}

b.conf 的配置是

server {
    listen        80;
    listen        [::]:80;
    server_name   b.com; # 这是你的b.com的域名
    ......
    location /static {
        root /home/baidu/www/PrintPlusPlus; # 这是你的新站点的目录路径
        if ($query_string) {
            expires max;
        }
    }
    ......
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:7000;    # 这个地址跟之前的要有区别
        client_max_body_size 100M;
    }
}
注意: default_server只能指定一个站点,其他的站点都不能指定default_server,否则就会重启时会报错

3.配置启动的进程

先查看下监管的进程

cat /etc/supervisord.conf

    
    
  • 1

滑动到最后一行

......
[include]
files = /etc/supervisor/*.conf

显示的是,在/etc/supervisor/ 目录下的所有的后缀为 .conf 的文件都会被监听和读取,我们创建了a.com和b.com两个站点,那么在这里就需要为 http://127.0.0.1:6000;http://127.0.0.1:7000; 两个进程做配置。

/etc/supervisor 目录下创建 a.conf和b.conf文件,a.conf里面的内容就写

[group:myAsite]
programs=myAsite-6000

[program:myAsite-6000]
command=/home/baidu/dlpy3/bin/python3 /home/baidu/www/myAsite/main.py --port=6000
directory=/home/baidu/www/myAsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/home/baidu/www/myAsite.log
loglevel=info

b.conf里面的内容就写

[group:myBsite]
programs=myBsite-7000

[program:myBsite-7000]
command=/home/baidu/dlpy3/bin/python3 /home/baidu/www/myBsite/main.py --port=7000
directory=/home/baidu/www/myBsite
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/home/baidu/www/myBsite.log
loglevel=info

以上两个站点的配置完毕后,我们就要重启他们了
首先重启网站进程

sudo supervisorctl reread
sudo supervisorctl reload

然后重启nginx

sudo nginx service restart

最后去访问 a.com 和 b.com就可以了

因为博主的域名在阿里云上买的,配置的子域名,在其他云服务器也是一样的,或者腾讯云,或者其他的云服务器

添加子域名
添加一个A记录,记录值的IP和主站的IP是一样的,也就是服务器的IP地址,不用带上端口号
比如你的服务器的IP是12.13.14.15,那你的主站域名也是12.13.14.15,子域名站点的IP也是12.13.14.15
因为你的服务器上的nginx会根据你访问的域名来读取你的相应配置,
/etc/supervisor/*.conf 就是用来具体读取那个网站的文件
/etc/nginx/conf.d/*.conf 就是用来做nginx的配置,比如ssl,访问设置权限等等



需要代码支持?

https://github.com/VictorZhang2014/tornado_testsite

在这里插入图片描述

其中etc目录是如何配置Nginx,而templates目录和main.py文件是Python+Tornado最基本的运行文件和代码,直接python main.py可以运行起来一个Python+Tornado的网站

课外阅读:
1.https://www.cnblogs.com/ysocean/p/9392908.html
2.https://blog.csdn.net/qq_36125138/article/details/84144932
3.https://blog.csdn.net/tsummerb/article/details/79248015

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" rel="stylesheet">
                </div>
</article>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值