(Tomcat | +python )
**

1. 动静分离概述:

1.1nginx动静分离

静态页面,静态页面,是指互联网架构中,几乎不变的页面 有与之匹配的技术架构来加速,例如:CDN nginx squid/varnish

动态页面: 动态页面,是指互联网架构中,不同用户不同场景访问,都不一样的页面,例如:百度搜索结果页 淘宝商品列表页 速运个人订单中心页

动静分离:动态资源(jsp、ftl、thymeleaf)与静态资源(js、css、img)分开部署。

通过中间件将动静分离和静态请求进行分离 可以减少不必要的请求消耗,同事能减少请求的延时。 动静分离后,即使动态服务不可用,但静态资源不会受到影响

image.png

2.nginx动静分离


2.1 部署Tomcat WebServer

注意:tomcat默认运行在8080端口,注意端口占用。

部署Tomcat YUM安装和二进制安装

1.yum安装版本较低 2 .二进制安装版本高

1.安装JAVA
[root@web01 ~]# yum install java -y

2.下载Tomcat
官网下载地址—-> 链接
wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.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.oldxu.com.conf

  1. server {
  2. listen 80;
  3. server_name tomcat.oldxu.com;
  4. location / {
  5. proxy_pass http://127.0.0.1:8080;
  6. proxy_set_header Host $http_host;
  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  8. }
  9. location ~* \.(png|gif)$ {
  10. root /code/images;
  11. expires 30d; #图片缓存过期时间
  12. }
  13. }

7.配置动静分离演示
[root@web01 ~]# rm -rf /soft/tomcat/webapps/ROOT/*
[root@web01 ~]# cat /soft/tomcat/webapps/ROOT/index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <html>
  3. <head>
  4. <title>Nginx+Tomcat动静分离</title>
  5. </head>
  6. <body>
  7. <%
  8. Random rand = new Random();
  9. out.println("<h2>动态资源</h2>");
  10. out.println(rand.nextInt(99)+100);
  11. %>
  12. <h2>静态图片</h2>
  13. <img src="nginx.png" />
  14. </body>
  15. </html>

[root@web01 ~]# /soft/tomcat/bin/shutdown.sh #停止tomcat
[root@web01 ~]# /soft/tomcat/bin/startup.sh #启动tomcat
[root@web01 ~]# mv /code/images/tomcat.png /code/images/nginx.png


2.2 集群环境动静分离效果模拟

负载均衡 动态资源处理程序 静态(图片等)资源处理程序
lb 10.0.0.5 tomcat 10.0.0.7 nginx 10.0.0.8

image.png

  1. 静态资源10.0.0.8
    [root@web02 ~]# cat /etc/nginx/conf.d/ds.oldxu.com.conf

    1. server {
    2. listen 80;
    3. server_name ds.oldxu.com;
    4. root /code/images;
    5. location / {
    6. index index.html;
    7. }
    8. }

    [root@web02 ~]# mkdir /code/images
    [root@web02 ~]# cd /code/images/ && wget [http://nginx.org/nginx.png](http://nginx.org/nginx.png)
    [root@web02 ~]# systemctl restart nginx

  1. 动态资源代码 10.0.0.7
    [root@web01 ~]# cat /soft/tomcat/webapps/ROOT/index.jsp
    1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    2. <html>
    3. <head>
    4. <title>Nginx+Tomcat动静分离</title>
    5. </head>
    6. <body>
    7. <%
    8. Random rand = new Random();
    9. out.println("<h2>动态资源</h2>");
    10. out.println(rand.nextInt(99)+100);
    11. %>
    12. <h2>静态图片</h2>
    13. <img src="nginx.png" />
    14. </body>
    15. </html>
  1. 接入负载均衡 10.0.0.5
    [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_ds.oldxu.com.conf ```bash upstream java { server 172.16.1.7:8080; }

upstream static { server 172.16.1.8:80; }

server { listen 80; server_name ds.oldxu.com;

  1. location ~* \.(png|gif|jpg)$ {
  2. proxy_pass http://static;
  3. include proxy_params;
  4. }
  5. location / {
  6. proxy_pass http://java;
  7. include proxy_params;
  8. }

}

  1. [root[@lb01 ](/lb01 ) ~]# `systemctl restart nginx`
  2. <a name="NgQ3e"></a>
  3. # *3. Nginx+Django框架项目(pytnon编写)
  4. ---
  5. <a name="zvih8"></a>
  6. ## 简介:
  7. > **djiango是一个开放源代码的Web应用框架,由Python写成。采用了MVT的软件设计模式,即模型Model,视图View和模板Template20057月在BSD许可证下发布。**
  8. **
  9. <a name="0CFik"></a>
  10. ## 3.1 图解
  11. **3.1.1 实现原理**
  12. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1581532/1604373366552-fa7b4621-2189-41e3-a660-7c3fc3b1e76e.png#align=left&display=inline&height=159&margin=%5Bobject%20Object%5D&name=image.png&originHeight=634&originWidth=2026&size=544278&status=done&style=none&width=507)
  13. **3.1.2 部署流程**<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1581532/1604392902924-88e05230-151f-4539-b8d6-a9b297b83648.png#align=left&display=inline&height=244&margin=%5Bobject%20Object%5D&name=image.png&originHeight=488&originWidth=772&size=60263&status=done&style=none&width=386)
  14. <a name="Mj2gP"></a>
  15. ## 3.2 部署
  16. <a name="exBrG"></a>
  17. ### 安装 python3 的环境
  18. `yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel \`<br />`sqlite-devel gcc gcc-c++ openssl-devel zlib zlib-devel python3 python3-devel`
  19. <a name="vjtms"></a>
  20. ### 安装 Django 框架、uwsgi
  21. ```bash
  22. [root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
  23. [root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==2.1.8
  24. [root@web01 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ uwsgi

配置Django工程

  1. [root@web01 ~]# cd /opt
  2. [root@web01 opt]# django-admin.py startproject demosite
  3. [root@web01 ~]# vim /opt/demosite/demosite/settings.py
  4. ALLOWED_HOSTS = ['*'] #授权能访问的主机

[root@web02 ~]# python3 /opt/demosite/manage.py runserver 0.0.0.0:9999 #开发人员启动姿势 image.png

配置uWSGI、配置Nginx

[root@web02 ~]# vim/opt/demosite/uwsgi.ini

  1. [uwsgi]
  2. socket = 127.0.0.1:9999 #uwsgi监听的端口
  3. workers = 2 #uwsgi启动进程数
  4. max-requests = 1000 #最大接收的请求数
  5. buffer-size = 30000 #buffer缓冲区大小
  6. pidfile = /run/uwsgi.pid #进程pid存放路径
  7. daemonize = /var/log/uwsgi.log #uwsgi日志存储路径

启动

[root@web01 ~]# uwsgi —ini /opt/demosite/uwsgi.ini [uWSGI] getting INI configuration from /opt/demosite/uwsgi.ini root@web01 ~]# netstat -lntp|grep 9999 tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 32894/uwsgi

  • 5.接入nginx (uwcgi_pass)

[root@web01 ~]# vim /etc/nginx/conf.d/djang.oldxu.com.conf

  1. server {
  2. listen 80;
  3. server_name django.oldxu.com;
  4. location / {
  5. index index.html; #默认返回的页面
  6. uwsgi_pass 127.0.0.1:9999;
  7. uwsgi_param UWSGI_CHDIR /opt/demosite; #工程所在的目录
  8. uwsgi_param UWSGI_SCRIPT demosite.wsgi; #demosite/wsgi接口文件 /opt/demosite/demosite/wsgi.py
  9. include uwsgi_params;
  10. }
  11. }

本机域名解析,浏览器问 image.png

3.3 Pythonav博客项目


3.3.1 效果展示

image.png

——> pythonav代码下载

3.3.2 部署流程

4.2.1 安装python基础环境

安装基础环境过程参见上一个实验

4.2.2 安装项目所依赖的模块

这个项目需要什么模块?开发会告诉你哦

  1. [root@web01 ~]# `unzip pythonav.zip -d /opt/`<br /> [root@web01 ~]# `cd /opt/`<br /> [root@web01 opt]# `pip3 install -i `[`https://mirrors.aliyun.com/pypi/simple/`](https://mirrors.aliyun.com/pypi/simple/)` -r /opt/pythonav/requirements.txt`

[root@web01 /opt]# cat /opt/pythonav/requirements.txt #开发告诉你要按安装那些模块 certifi==2018.11.29 chardet==3.0.4 Django==1.11 idna==2.8 Pillow==5.4.1 PyMySQL==0.9.3 pytz==2018.9 requests==2.21.0 urllib3==1.24.1


4.2.3 修改配置,连接数据库
[root@db01 ~]# mysql -uroot -p123456
MariaDB [(none)]> create database pythonav;

  1. [root@web01 opt]# `vim /opt/pythonav/pythonav/settings.py ` #修改数据库连接配置
  1. ...
  2. DATABASES = {
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.mysql',
  5. 'NAME': 'pythonav',
  6. 'USER': 'all',
  7. 'PASSWORD': '123456',
  8. 'HOST': '172.16.1.51',
  9. 'PORT': '3306',
  10. }
  11. }
  12. ....

4.2.4 将项目表生成出来
[root@web01 ~]# cd /opt/pythonav
[root@web01 pythonav]# python3 manage.py makemigrations
[root@web01 pythonav]# python3 manage.py migrate

4.2.5 收集静态资源至统一位置存储
[root@web01 pythonav]# python3 manage.py collectstatic

*4.2.6 通过uwsgi文件拉起项目 ( 开发常用)
[root@web01 opt]# uwsgi --ini /opt/pythonav/pythonav_uwsgi.ini
[root@web01 opt]#netstat -lntp | grep 8811
tcp 0 0 127.0.0.1:8811 0.0.0.0:* LISTEN 3068/uwsgi

随机开个端口提供访问测试 python3 /opt/pythonav/manage.py runserver 0.0.0.0:9123

4.2.7 Nginx通过uwsgi接入python站点
[root@web01 pythonav]# cat /etc/nginx/conf.d/av.etiantian.org.conf

  1. server {
  2. listen 80;
  3. server_name av.etiantian.org;
  4. location / {
  5. uwsgi_pass 127.0.0.1:8811;
  6. include uwsgi_params;
  7. }
  8. location /static {
  9. alias /opt/pythonav/static;
  10. }
  11. }

浏览器访问

3.4其他开源项目(gitee.com)


  • 下载Django开发的博客
    [root@web02 ~]# 代码
    [root@web02 ~]# unzip BBS.zip -d /code/
  • 安装博客所依赖的模块( 开发会在写一个re……文件 )
    [root@web02 BBS]# pip3 install -i [https://pypi.doubanio.com/simple/](https://pypi.doubanio.com/simple/) -r /code/BBS/re.txt
  • 安装数据库、导入项目的数据库文件
    登陆51数据库
    [root@db01 ~]# mysql -uxxx -pxxxx;
    MariaDB [(none)]> create database bbs charset utf8mb4;
    MariaDB [(none)]> use bbs; #进入bbs库
    MariaDB [bbs]> source /root/bbs.sql; #导入/root/bbs.sql
    MariaDB [bbs]> grant all privileges on *.* to 'all'@'%' identified by 'xxxxx'; #授权远程连接的用户和密码
  • 配置应用程序连接数据库的地址
    [root@web02 BBS]# vim /code/BBS/BBS/settings.py
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'bbs',
  5. 'HOST': "172.16.1.51",
  6. 'USER': 'all',
  7. 'PASSWORD': 'oldxu.com',
  8. 'PORT': 3306,
  9. }
  10. }

4.配置Django项目已uwsgi方式启动
[root@web02 ~]# cat /code/BBS/uwsgi.ini
[root@web02 ~]# cat /code/BBS/uwsgi.ini

  1. [uwsgi]
  2. #uwsgi监听的端口
  3. socket = 127.0.0.1:8899
  4. #uwsgi启动进程数
  5. workers = 2
  6. #最大接收的请求数
  7. max-requests = 1000
  8. #buffer缓冲区大小
  9. buffer-size = 30000
  10. #进程pid存放路径
  11. pidfile = /run/uwsgi-bbs.pid
  12. #uwsgi日志存储路径
  13. 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

  1. server {
  2. listen 80;
  3. server_name bbs.oldxu.com;
  4. client_max_body_size 100M;
  5. location /static {
  6. alias /code/BBS/static/;
  7. expires 1d;
  8. }
  9. location /media {
  10. alias /code/BBS/media/;
  11. }
  12. location / {
  13. include uwsgi_params;
  14. uwsgi_pass 127.0.0.1:8899;
  15. uwsgi_param UWSGI_SCRIPT BBS.wsgi;
  16. uwsgi_param UWSGI_CHDIR /code/BBS;
  17. }
  18. }