动静分离
什么的动静分离
所谓动静分离,就是把动态请求和静态请求分开处理。
为什么要做动静分离
tomcat在处理静态资源时效率不高,单默认情况下所有资源都有tomcat处理,需要进行复杂的逻辑运算,从而会导致应用响应慢,并且还会占用不必须要的系统资源。
实现动态请求和静态请求分离后,可以减少系统不必要的消耗和耗时,以便加快系统的处理性能。
如何实现动静分离
Nginx通过用户请求的uri来区分请求的类型,并转发到不同的服务端。如果请求的uri包含pg、png等资源则由nginx处理,如果请求的uri包含php、jsp等资源则代理至tomcat服务处理。
单机实现动静分离
(tomcat默认运行在8080端口,需要关闭本机的8080端口,以避免端口冲突。)
部署过程:
1.安装JAVA
[root@web01 ~]# yum install java -y
2.下载Tomcat
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
3.安装Tomcat
[root@web01 ~]# mkdir /soft
[root@web01 ~]# tar xf apache-tomcat-9.0.34.tar.gz -C /soft/
[root@web01 ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
5.启动Tomcat
[root@web01 ~]# /soft/tomcat/bin/startup.sh
6.接入Nginx
[root@web01 ~]# cat /etc/nginx/conf.d/tomcat.wenjie.com.conf
server {
listen 80;
server_name tomcat.wenjie.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* \.(png|gif)$ {
root /code/images;
expire 30d;
}
}
tomcat的长处是专门处理解析java代码
nginx 的长处的处理静态资源
将二者互相结合那么就可以发挥二者的长处
集群的方式实现动静分离
实现方法:
环境:
lb 10.0.0.5
tomcat 10.0.0.7 动态资源处理程序
nginx 10.0.0.8 静态资源处理程序
1.静态资源10.0.0.8
[root@web02 ~]# cat /etc/nginx/conf.d/ds.wenjiecom.conf
server {
listen 80;
server_name ds.wenjie.com;
root /code/images;
location / {
index index.html;
}
}
[root@web02 ~]# mkdir /code/images
[root@web02 ~]# cd /code/images/
[root@web02 images]# wget http://nginx.org/nginx.png
[root@web02 ~]# systemctl restart nginx
2动态资源 10.0.0.7
[root@web01 ~]# cat /soft/tomcat/webapps/ROOT/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>Nginx+Tomcat动静分离</title>
</head>
<body>
<%
Random rand = new Random();
out.println("<h2>动态资源</h2>");
out.println(rand.nextInt(99)+100);
%>
<h2>静态图片</h2>
<img src="nginx.png" />
</body>
</html>
3接入负载均衡 10.0.0.5
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_ds.wenjie.com.conf
upstream java {
server 172.16.1.7:8080;
}
upstream static {
server 172.16.1.8:80;
}
server {
listen 80;
server_name ds.wenjie.com;
location ~* \.(png|gif|jpg)$ {
proxy_pass http://static;
include proxy_params;
}
location / {
proxy_pass http://java;
include proxy_params;
}
}
[root@lb01 ~]# systemctl restart nginx
这样我们的所有静态资源都在web02上
动态资源都在web01上
Uwsgi代理
什么是wsgi
WSGI是Web Server Gateway Interface的缩写。以层的角度来看,WSGI所在层的位置低于CGI。但与CGI不同的是WSGI具有很强的伸缩性且能运行于多线程或多进程的环境下,这是因为WSGI只是一份标准并没有定义如何去实现。实际上WSGI并非CGI,因为其位于web应用程序与web服务器之间,而web服务器可以是CGI,mod_python(注:现通常使用mod_wsgi代替),FastCGI或者是一个定义了WSGI标准的web服务器就像python标准库提供的独立WSGI服务器称为wsgiref。
什么是uwsgi
实现了wsgi、uwsgi等数据交换协议,nginx是实现uwsgi协议最具代表性的web软件
uwsgi为什么需要使用nginx
- 安全
后端服务直接以Xhttp对外提供访问,往往会暴露后端的真实服务,如果使用nginx 可以很好的隐藏后端的服务,并且Nginx能够实现访问控制、访问限制、以及Rewnite. HTTPS 等功能。 - 效率
nginx可以直接处理静态资源, 然后将动态内容通过UWSGI协议转发给后端Django, 以此实现动静分离,以便更好的响应用户请求。
配置uwsgi
步骤一、安装 python3 的环境
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel \
sqlite-devel gcc gcc-c++ openssl-devel zlib zlib-devel python3 python3-devel -y
步骤二、安装 Django 框架、uwsgi
[root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
[root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==2.1.8
[root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ uwsgi
步骤三、配置Django工程
[root@web02 ~]# cd /opt
[root@web02 opt]# django-admin.py startproject demosite
[root@web02 ~]# vim /opt/demosite/demosite/settings.py
修改
ALLOWED_HOSTS = ['*']
[root@web02 ~]# python3 /opt/demosite/manage.py runserver 0.0.0.0:9999
步骤四、配置uWSGI、配置Nginx
[root@web02 ~]# cat /opt/demosite/uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:9999
#uwsgi启动进程数
workers = 2
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi.log
[root@web02 ~]# uwsgi --ini /opt/demosite/uwsgi.ini
[uWSGI] getting INI configuration from /opt/demosite/uwsgi.ini
[root@web02 ~]# netstat -lntp|grep 9999
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 32894/uwsgi
[root@web02 ~]# vim /etc/nginx/conf.d/djang.oldxu.com.conf
server {
listen 80;
server_name django.oldxu.com;
location / {
index index.html;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_CHDIR /opt/demosite; #工程 所在的目录
uwsgi_param UWSGI_SCRIPT demosite.wsgi; #demosite/wsgi接口文件 /opt/demosite/demosite/wsgi.py
include uwsgi_params;
}
}
---------django开发的博客:差劲
gitee.com搜索较好的开源项目
1.下载Django开发的博客
[root@web02 ~]# wget http://cdn.xuliangwei.com/BBS.zip
[root@web02 ~]# unzip BBS.zip -d /code/
2.安装博客所依赖的模块( 开发会在写一个re......文件 )
[root@web02 BBS]# pip3 install -i https://pypi.doubanio.com/simple/ -r /code/BBS/re.txt
3.安装数据库、导入项目的数据库文件
登陆51数据库
[root@db01 ~]# mysql -uroot -poldxu.com
MariaDB [(none)]> create database bbs charset utf8;
MariaDB [(none)]> use bbs; #进入bbs库
MariaDB [bbs]> source /root/bbs.sql #导入/root/bbs.sql
MariaDB [bbs]> grant all privileges on *.* to 'all'@'%' identified by 'oldxu.com'; #授权远程连接的用户和密码
配置应用程序连接数据库的地址
[root@web02 BBS]# vim /code/BBS/BBS/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bbs',
'HOST': "172.16.1.51",
'USER': 'all',
'PASSWORD': 'oldxu.com',
'PORT': 3306,
}
}
4.配置Django项目已uwsgi方式启动
[root@web02 ~]# cat /code/BBS/uwsgi.ini
[root@web02 ~]# cat /code/BBS/uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:8899
#uwsgi启动进程数
workers = 2
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi-bbs.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi-bbs.log
[root@web02 ~]# uwsgi --ini /code/BBS/uwsgi.ini
5.配置Nginx代理至Uwsgi服务
[root@web02 ~]# cat /etc/nginx/conf.d/bbs.oldxu.com.conf
server {
listen 80;
server_name bbs.oldxu.com;
client_max_body_size 100M;
location /static {
alias /code/BBS/static/;
expires 1d;
}
location /media {
alias /code/BBS/media/;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8899;
uwsgi_param UWSGI_SCRIPT BBS.wsgi;
uwsgi_param UWSGI_CHDIR /code/BBS;
}
}