划重点,要考的:
正向代理
代理的是客户端
,反向代理
代理的是服务器
什么是正向代理?
举例子:我们想访问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_641.先通过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.44.通过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/*.ini
为files = /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/82153171Nginx无法启动的参考:
https://stackoverflow.com/questions/35868976/nginx-not-started-and-cant-starthttps://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>