网站服务器搭建小记

从零学网站搭建

学习搭网站~ web 方面啥都没接触,从零学起,特地开个博客记录学习过程中的点点滴滴~
现在已经买了服务器,域名还在审核(不知道要多久。。。),今晚开始搭。

一、Apache 的搭建及 Linux 的学习

参考文章https://blog.csdn.net/chenxiaohua/article/details/2047757
1. 怕搞坏服务器,所以在虚拟机上先试试。不知道这个VMware怎么了,不能直接从桌面拖动文件到虚拟机,搞了半天才把文件从主机传到虚拟机。我用的是文件共享的方法,把桌面的文件共享到虚拟机里,查了半天才知道* linux 系统会共享到 /mnt/hgfs * 中。
2. Linux源码编译安装包的过程一般都是 ./configure –> make –> make install. 其中 ./configure –prefix=/usr/local/ ** 的意思是安装到哪里,不懂,先记下来。
3. Linux命令控制中 command1 && command2 :如果命令1执行成功,则执行命令2
command1 || command2 : 如果命令1执行失败,则执行命令2
4. 在安装的时候出了车祸:因为要修改一下 sudo 的环境变量,chmod 777 sudoers,修改了之后直接无法运行 sudo ,要修改文件的权限又需要 sudo 。明天继续解决。
问题终于被干掉。先在腾讯云中重置root用户的密码,再通过腾讯云提供的 VNC 登录 root 用户,修改 /etc/sudoers 的权限,OK。
5. apache 的 access_log 文件记录着访问此服务器的历史记录,以空格分为 7 项。


  • 第一项:访问此服务器的IP
  • 第四项:[访问此服务器的时间 时区]   如 +0800 就表示东 8 区
  • 第五项:“请求方法 请求资源 请求协议”
  • 第六项:返回状态代码
  • 第七项:返回数据字节数

6. Linux 光标操作(只写了我没记住的)

  • ctrl + e :移动光标到行尾
  • ctrl + d :删除光标之后的一个字符
  • ctrl + w : 删除行首到当前光标所在位置的所有字符
  • crtl + k : 删除当前光标到行尾的所有字符

  • apache的搭建就此结束٩(๑>◡<๑)۶
    这里写图片描述
    又get新东西:
    主页都是 IP:PORT ,如果想访问子页面,只需要的Apache对应的文件里面建一个文件夹,里面放上index.html就可以了。
    比如:你想访问 12.34.56.78:80/test ,只需要在你的服务器里的 htdoc 文件夹里在建一个文件夹叫 test ,建一个 index.html ,这个 html 文件就是会展示在你想访问的网址下面的。


二、web.py

web.py是官方演示的一个重要的包,用它可以来做一个轻量级的web服务器。

# -*- coding=utf-8 -*--
# filename : Web.py

import web
urls = ('/', 'Hello')
app = web.application(urls, globals())


class Hello:
    def GET(self, name):
        render = web.template.render('templates/')
        name = 'Bob'
        return render.index(name)
  1. urls = (‘/’, ‘类名’) 一个元组,第一个是正则表达式,到现在还明白是怎么用的…原谅我太菜。第二个是下面自己定义的一个类的名字,表示受到请求后会实例化这个对象,然后执行你在类中写的GET / POST 方法。
  2. app = web.application(urls, globals()),urls 就是上面的元组,作为构造方法的参数,globals() 是一个内置方法,返回所有的全局变量,作用是从这里面找到要实例化的类对象。
  3. app.run() 阻塞状态执行代码,执行后即可接受请求。
    有了这三步,就可以搭成一个简单的 web 服务器了。
  4. 运行参数: python3 Web.py 8080 表示开放 8080 端口当做服务接口
    python3 Web.py IP:PORT 表示用此 IP 地址开放 PORT 端口当做服务器接口。

三、微信服务器绑定

首先,你要有一个服务器。(emmm废话么这不是)
这里写图片描述
如图,URL 不能加端口,否则会找不到你提供的服务器(微信官方提供的Wiki说格式是 http://IP:端口号 /wx ,这个格式是不对的)
token 是你自己约定的一个秘钥,在服务器端的 token 要与此对应起来
EncodingAESKey 暂时还用不到。
对于我这个萌新来说,消息加解密方式还是明文吧。。
这个服务器认证的过程,就是给你三个明文,一个用 sha1 加密过三个明文的密文,再让你在服务器运行一遍 sha1 加密,看看本地加密之后的密文是否与传来的密文对应,如果对应, 返回给服务器一个他告诉你他想要的结果(这个结果和明文密文一并发送过来)。
这是我服务器认证成功的 python3 代码:
(官方的 python2 把我折磨了好一顿 ̄ω ̄= 好多常用的内置函数 python2 和 3 竟然都不一样)

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

MYTOKEN = 'token' # 自己约定的token,需要与网页上的token对应起来

class Handle(object):
    def GET(self): #执行GET方法
        data = web.input()
        if len(data) == 0: # data 为空一般是从网页传来的无参数的GET方法
            return 'Hello, this is handle view'
        signature = data.signature # signature是发送过来的密文
        timestamp = data.timestamp
        nonce = data.nonce
        echostr = data.echostr # echostr是如果对应成功服务器想要的结果
        token = MYTOKEN
        lst = [token, timestamp, nonce] # 自己约定的token,微信端发来的timestamp和nonce就是三个将被加密的明文
        # 加密的方式是,先对三个字符串排序,再按顺序从小到大经过sha1加密
        for i in range(len(lst)): # 官方的Wiki用的是map,因为是py2的代码,所以map能实现这个for循环的功能,然而在py3中map是不能达到此功能的
            lst[i] = bytes(str(lst[i]), encoding='utf8')
        lst.sort()
        sha1 = hashlib.sha1()
        for each in lst:
            sha1.update(each)
        hashcode = sha1.hexdigest() # hashcode就是最终加密的结果
        print('handle/GET func: hashcode, signature: ', hashcode, signature)
        if hashcode == signature:
            return echostr # 对应成功则发送给服务器
        else:
            return "" # 对应失败发送任意字符表示失败
# -*- coding: utf-8 -*-
# filename: main.py

import web
from handle import Handle
urls = ('/wx', 'Handle')


if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run() #让自己的服务器运行起来,接受微信服务器的GET方法并返回数据

最后在命令行执行 python3 main.py 80 ,再在网页中点确认即可。

关于微信的 API 的使用,找了个做过的大佬请教了一下,在博客上记录一下最基本的东西。
1. access_token : access_token 是获得所有微信公众号 API 权限的凭据。首先需要请求一个网址获得一个 ‘code’ 值,在根据 ‘code’ 值再请求一个网址获得access_token。access_token的对象是一个公众号
2. OpenID : 一个微信用户在多个不同公众号上会对应多个 OpenID ,OpenID 是公众号用来识别用户的一个 ID ,对于未认证公众号不开放。


四、css单位

ch —- 一个数字字符或半个中文字符的宽度
em —- 2em代表当前字符的两倍宽度,相当于 ‘%’
px —- 一个像素的宽度
vh —- 把当前窗口的高度分成 100 份,1vh 就是一份高度
vw —- 把当前窗口的宽度分成 100 份,1vw 就是一份宽度
vm —- vh和vw中取较小的那个


五、HTML新学到的东西

  • 多媒体元素

    在 H5 中,要播放视频或音频,vedio 和 audio 标签兼容性较高。
<vedio src='URL' controls autoplay loop muted poster='URL' width='200px' height='200px'> 
    若无法正常显示则出现此文本
</vedio>
<!-- src表示视频的地址,controls表示是否让用户控制视频播放(暂停等功能),poster表示视频加载前显示的图片 -->
<audio src='URL' controls autoplay loop muted>
若音频无法播放,则显示此文本
</audio>
<!-- 各个属性参照上面video标签 -->
  • label 标签

    把 input 标签用 label 标签包起来,可以更方便的实现 input 文本输入的焦点获得。
    好吧说白点就是 input 的文本输入用 label 包起来后,点击 label 标签内的任意元素(文字等),input 输入框都可以获得焦点。
<label> 点击此文本可以获得输入框焦点 <input type="text"> </label>
  • 让背景不随滑轮的滚动而变化:
body {
    background-attachment: fixed
}

六、CSS新学到的东西

  • 一个标签可以有多个 class ,同时受到 css 文件中多个 class 的效果
  • 子类选择器:
#p span{ <!-- 只有p标签里的所有span标签会受到此选择器的效果 -->
    font-size=18px;
}
 <!-- 注意中间是空格 -->
  • 同时针对多个类型选择器
#idValue1, .classValue1, #idValue2 { <!-- 多个类型选择器用逗号隔开,都会受到同样效果 -->
    font-size=15px;
}
  • ol 或者 ul 的 css 属性中的 list-style 中可以设置开头标志是空心圆、实心圆或者自定义图片,还可以设置开头标志 inside 或者 outsize。
    注:list-style-img 与 style-list-type 不能同时出现。
 <ol style="list-style: url(./img/xx.jpg) outside">
     <option> op1 </option>
 </ol>
  • float :不改变当前标签的上下位置,而让标签向你希望的方向漂浮,常用于将多个块级标签放在一排。
  • 与此相对的有 clear ,有标签 float 后,下面的标签会往上凑,会导致下面的标签被 float 的标签覆盖,如果不想覆盖,而放在 float 标签的下面,需要增加新放上去的标签一个 clear : both / left / right 属性。
  • 选择器:[src^=”abc”] 是所有的 src 属性以 “abc” 开头的所有标签。
    a[href$=”.com”] 所有的 fref 属性以 “.com” 结尾的 a 标签。
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值