Apache常用配置指北
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache常用配置指北相关的知识,希望对你有一定的参考价值。
参考技术A Apache 作为世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一相信前端的小伙伴对于 apache 和 nginx 都有所了解,特别是前后端分离,独立开发部署后,使用web服务器做一些代理服务可以解决绝大多数因为前后端分离造成的跨域,认证等问题(PS:都2020年了,不会还有项目组主张使用weblogic或tomcat部署前端项目吧? 不会吧,不会吧,不会吧 😓)
下面,我从实际项目角度出发,说一些apache常用配置,相信做到以下配置之后,基本可以解决前端项目部署对接时80%以上的问题 (😃 我骗你的,我怎么知道能解决多少,反正先说一个数嘛)
示例:
Directory指令用于在配置的目录(示例内'/apache/web'目录)内封装一组指令,配置的指令在该目录及子目录生效。任何可以在"directory"作用域中使用的指令都可以使用
从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override, 即设置 AllowOverride None ,此时,配置目录及子目录的.htaccess 文件将被完全忽略。
当此指令设置为 All 时,所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中
示例:
apache的Alias配置即虚拟路径配置,如示例中,假设apache服务器启动地址为 http://localhost:3000 ,当访问 http://localhost:3000/public/test.mp4 时, 会返回服务器 /extra/video/public/test.mp4 视频文件。
示例:
示例效果为将输入 en.cmbc.com 时,跳转到 http://www.cmbc.com.cn/
Apache Rewrite规则修正符
Rewirte即apache的重写规则,主要的功能就是实现URL的跳转,匹配规则支持正则匹配。
示例:
apache中的mod_proxy模块用于url的转发,即具有代理的功能。
ProxyPass即转发功能,如示例中的配置,为将 http://localhost:3000/swaggerui 的请求转发至 http://197.0.35.4:7000/swaggerui 服务器.
ProxyPassReverse 的配置和 ProxyPass 的配置一致,它用于反向代理,例如示例中请求 http://localhost:3000/swaggerui 后,转发给配置的目标服务器( http://197.0.35.4:7000swaggerui ),返回的处理结果为重定向redirect至 http://197.0.35.4:7000/login.html 登录页,此时若未配置反向代理,浏览器会访问 http://197.0.35.4:7000/login.html ,而配置反向代理后,apache服务器会在重定向时,修改redirect地址为 http://localhost:3000/login.html 。
示例:
负载均衡配置稍显复杂,后续会专门总结一下相关配置,以上示例配置所达到的效果为:请求 http://localhost:3000/version_manager 时,会均衡负载发至 http://197.0.35.105:31382/version-manager 和 http://197.0.35.105:31382/version-manager 两台服务器。
示例:
启用Apache的deflate模块,可以开启压缩功能,减小网站传输时的带宽。
Django快速开发实践:Drf框架和xadmin配置指北
步骤
既然是快速开发,那废话不多说,直接说步骤:
- 安装Djagno
- 安装Django Rest Framework
- 定义models
- 定义Rest framework的serializers
- 定义Rest framework的viewsets
- 配置Rest framework的router
- 配置管理后台admin
- 根据需要写template和对应的view
经过这些步骤就能得到一个具备完整的后端接口和后台管理界面的网站了,如果写了template的话还能把前端的工作也做了。
接下来按照上面提到的顺序记录一下我的开发实践。
定义models
好像没啥好说的,Django3多了几个新的特性,可以用class来定义choices,这个比以前的元组定义方便一些,其他的好像没什么了,对了,定义ManyToMany最好设置一个related_name,方便以后在代码里做反向查询。
定义serializers
这个很简单,只要告诉框架你需要序列化model的哪个字段就好了。
官方文档:https://www.django-rest-framework.org/tutorial/1-serialization/
代码例子如下:
from .models import *
from rest_framework import serializers
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = [‘name‘, ‘gender‘, ‘number‘, ‘faculty‘, ‘major‘, ‘year‘]
附上这个Student的model代码:
class Student(models.Model):
name = models.CharField(‘姓名‘, max_length=10)
gender = models.IntegerField(‘性别‘, default=1, choices=GenderChoices)
number = models.CharField(‘学号‘, max_length=20, blank=True)
faculty = models.CharField(‘学院‘, max_length=20, blank=True)
major = models.CharField(‘专业‘, max_length=20, blank=True)
year = models.CharField(‘届别‘, max_length=4)
def __str__(self):
return self.name
定义viewsets
就是把queryset和serializers关联起来。
贴一下代码,对应上面的student的serializers。
from rest_framework import viewsets
from .models import *
from .serializers import *
class StudentViewSet(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
配置router
可以理解为Rest Framework的urls配置。
代码:
from rest_framework import routers
from core import views
router = routers.DefaultRouter()
router.register(‘user‘, views.UserViewSet)
然后再加入Django的urls配置中:
urlpatterns = [
path(‘admin/‘, admin.site.urls),
path(‘api/‘, include(router.urls)), # 这里
path(‘api-auth/‘, include(‘rest_framework.urls‘)), # 和这里
]
干净利索,这个router应该和urls一样能嵌套的,不过我没有深入学Rest Framework,所以没有了解到,以后有需要再查一下文档。
关于drf的简单参考文档:
配置管理后台admin
其实这一步也可以放在前面,就是刚定义完models的时候就配置,这样方便管理数据。
Django自带的这个admin可以说很强大了,可以省去很多中小型网站的管理后台开发工作,不过默认的界面是比较丑的,这个用过的人都懂,但是又想用,怎么办?所以要进行美化啊,以前我只知道xadmin这个库,国人开发的,基于bootstrap3界面,重写了整套admin代码,界面好看了不少,无奈有很多bug,文档又几乎是没有的,很多功能实现都只能去看代码,体验极差,严重影响开发效率……(但是为了界面好看我一开始还是只能用这个了)
关于Django配置详情可以看刘江大大的博客,很详细,在我下面的第一个参考链接里面~
界面效果大概这样:
然后我又发现了一个新的xadmin替代品,叫simpleui,号称vue+element ui写的,界面也不错,实际体验嘛,emmm……和xadmin互有千秋。不过这货搞了个pro版本,也就是付费版,所以开源免费版这个能用就偷着乐了,你懂的。
界面如下,还可以换主题。
有兴趣请看看官方github:https://github.com/newpanjing/simpleui
安装xadmin
现在Django-xadmin好像已经不维护了,至少在github上看到是作者去写纯前端的xadmin框架了,然后安装起来也是一波三折,你直接在pip安装也不行,因为那个是xadmin的0.x版本,支持的是Django1.x的,要安装xadmin的django2分支,才能支持Django2.x,然后我一开始用上Django3,貌似这货还和Django3有兼容问题……
那到底怎么安装才好啊?简单点的方法就是官方github说的:
pip install git+git://github.com/sshwsfc/xadmin.git@django2
不过这个方法我有时候可以有时候不行,好像是github被屏蔽了吧,唉,所以还有别的方法,就是安装打包好的wheel文件,从xadmin官方仓库把代码下载下来,然后checkout到django2分支,再运行命令打包成wheel文件,接着就可以拿去pip安装了,有空我上传到pypi,方便一下有需要的同学。
安装完运行可能还会报错:TypeError: render() got an unexpected keyword argument ‘renderer‘,原因是集成DjangoUeditor时出错,需要需要修改虚拟环境下的boundfield.py文件,位置在venv/lib/python3.6/site-packages/django/forms/boundfield.py
,修改内容:
89 return widget.render(
90 name=self.html_initial_name if only_initial else self.html_name,
91 value=self.value(),
92 attrs=attrs,
93 # renderer=self.form.renderer,(93行处注释掉,就能正常运行了)
94 )
xadmin配置
xadmin的配置和Django的差不多,但是也有一点小区别,不过还好它支持Django的messages框架,simpleui好像不支持……有毒
Django admin的配置是写在每个app下面的admin.py文件的,xadmin得写在adminx.py里,然后好像也没法像Django一样用装饰器注册admin类,下面的代码展示了注册admin方法:
xadmin.site.register(model类, admin类)
注意xadmin的admin类还不能像Django一样继承ModelAdmin
类,只能继承BaseAdminObject
或干脆不写,我看xadmin的源码是继承自object
的(跟不写一样)
下面这个例子就很全了,各种属性的配置。
class CourseAdmin(object):
‘‘‘课程‘‘‘
list_display = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘] #显示的字段
search_fields = [‘name‘, ‘desc‘, ‘detail‘, ‘degree‘, ‘students‘] #搜索字段
list_filter = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘] #过滤字段
model_icon = ‘fa fa-book‘ #自定义图标
ordering = [‘-click_nums‘] #排序功能
readonly_fields = [‘click_nums‘] #只读字段,不能编辑
exclude = [‘fav_nums‘] #不显示的字段
inlines = [LessonInline,CourseResourceInline] #增加章节和课程资源
list_editable = [‘degree‘,‘desc‘] #在列表页可以直接编辑的
list_display = [‘get_zj_nums‘] #直接使用函数名作为字段显示
list_display = [‘go_to‘] # 跳转到上面定义的地址
refresh_times = [3,5] #自动刷新(里面是秒数)可选3或5秒
admin类的属性详情
- model_icon:图标用的是font awesome图标,不过这个网站国内好像访问不了,所以我们用国内版的网站替代,http://www.fontawesome.com.cn/icons-ui/
- inlines的配置和Django的差不多,不过不能像Django一样集成xxxinline的父类……要定义的话参考下面的代码:
class LessonInline(object):
model = Lesson
extra = 0
class CourseResourceInline(object):
model = CourseResource
extra = 0
- 还有一个图表功能,不过我觉得没啥用,主要是x坐标换成char字段就显示不出来了,很恶心,例子:
data_charts = {
"user_count": {‘title‘: u"course_num", "x-field": "addtime", "y-field": ("course_num"),
"order": (‘addtime‘,)
}
}
效果这样:
admin类的一些方法覆盖
为啥要覆盖?当然是要自定义一些操作啊,比如你要保存用户信息的时候验证某些字段,通过才给保存,不通过就给出提示,咋搞,覆盖父类函数呀!
代码例子:
class ExamineAdmin(BaseAdminObject):
.......
def save_models(self):
# 获取保存的新对象
obj = self.new_obj
# 获取原来的对象,如果是创建新对象,则org_obj为空
org_obj = self.org_obj
if 不满足条件:
self.message_user(message="不满足xxx条件", level=‘error‘)
else:
return super().save_models()
大概就这样,显示信息的话基本能满足,不过就算显示了“不满足xxx条件”的信息,不保存这个model对象,也还会出来一个保存成功信息,xadmin似乎没有提供api关掉,文档啥也没写,要解决这个问题还是自己啃xadmin代码吧,不然靠搜索和文档完全就是黑箱操作……无力吐槽
参考:
- http://www.liujiangblog.com/course/django/93
- https://www.cnblogs.com/Eric15/articles/9589396.html
- https://www.jianshu.com/p/12808095cff3
写在最后
不得不说,使用Python Django开发网站效率太高了,很方便就做出一套可以用的API+后台管理系统,拿来应付各种课程设计、需求简单的外包都是绰绰有余,而且相关资料也很多,有心学习的话花点时间掌握开发商业网站项目完全不在话下!至于有人质疑Python的性能,人家Instagram的后台就是全套Django开发的,这亿级的用户量可不是闹着玩的,了解一门技术之后好好深入学习提高比整天跟风搞些花里胡哨的有用得多了……
不过最近看了很多net core的博客和知乎问题,我还是看好这个net core5的未来,接下来花点时间继续学我的C#,虽然工作可能用C++比较多……(逃
欢迎交流
交流问题请在微信公众号后台留言,每一条信息我都会回复哈~
- 微信公众号:画星星高手
- 打代码直播间:https://live.bilibili.com/11883038
- 知乎:https://www.zhihu.com/people/dealiaxy
- 简书:https://www.jianshu.com/u/965b95853b9f
以上是关于Apache常用配置指北的主要内容,如果未能解决你的问题,请参考以下文章