划重点,要考的:
正向代理
代理的是客户端
,反向代理
代理的是服务器
查看linux的系统是否是CentOS
cat /etc/redhat-release
查看硬盘以GB的方式显示
df -h
查看CPU相关信息
lscpu
cat /proc/cpuinfo
查看CPU核数
echo "Threads/core: $(nproc --all)"
查看Memory大小
cat /proc/meminfo
free
什么是反向代理?
反向代理对客户端来说是无感知的,客户端不需要进行任何配置就可以访问。
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)、简单的配置,叫做Round-Robin
,也就是轮询
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 $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;
}
(6)、最少连接数 least_conn;
最少连接数,如他的名字一样,哪一台服务器当前的连接数少,就把新请求分配的哪一台服务器
upstream test {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
DNS 负载均衡
主要就是在域名解析的地方,添加多个A记录,这几个A记录的不同IP的服务器都是指向同一个域名,比如域名: souchain.org,那么A记录就是
souchain.org A记录 114.100.20.201
souchain.org A记录 114.100.20.202
souchain.org A记录 114.100.20.203
这个意思是,三个不同IP的服务器都可以被souchain.org域名解析到,那么基于DNS负载均衡的算法是什么了?
答:是轮询。意思是,如上集群有三个服务器,每个请求来了就按照依次排列分配请求任务,忽略了每台服务器的性能。
DNS的负载均衡的优点挺多:不需要人维护,不需要修改代码,只需简单的一下配置即可完成。但是最重要的缺点是,如果基于DNS负载均衡的集群服务器中有一台服务器挂掉了,那么正好又有些用户访问了这台宕机的服务器,会导致这些用户在一段时间内访问失败,这是由于DNS缓存的原因。虽然可以再去修改A记录到一台正常访问的机器上,但是还是会由于生效时间的几分钟不可访问。
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/*.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
和supervisorctl
运行时使用的是同一个配置文件,也都支持-c参数,确保supervisord在运行,使用pgrep -fl supervisor
启动监听程序
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 - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$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
https的阿里简单配置
https://help.aliyun.com/knowledge_detail/95491.html?spm=5176.2020520154.cas.29.25f03HoH3HoHjm
然后启动nginx
Nginx的命令
sudo service nginx start # 启动
sudo service nginx stop # 停止
sudo service nginx restart # 重启
sudo nginx -s reload # 重启
此时在你的客户端电脑上就可以访问你刚配置的网站了,访问地址是:
你的服务器ip,属于http访问。如下图所示
查询nginx运行所在的进程
ps -ef|grep nginx
Nginx官方指导:
https://www.nginx.com/resources/wiki/start/topics/examples/full/
另一个指导:
https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx/
如果发现nginx启动不了,显示nginx Address already in use
解决方案是:
1.查看80端口和443端口谁在用
sudo netstat -tulpn
2.关闭80和443端口
sudo fuser -k 80/tcp
sudo fuser -k 443/tcp
3.重启nginx
sudo service nginx restart
如果以上配置好了之后,部署到服务器上总是报502 Bad Gateway的话
if __name__ == "__main__":
tornado.options.parse_command_line() # 这句话很重要,卡了好几天,沉重的心情终于放下了!!!
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
如果云服务器重启后,发生错误是: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
滑动到最后一行
......
[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