云服务器搭建记录

try my best to face problem.

Posted by Doni Daniel on September 30, 2019

#腾讯云使用记录 ##运维开发 ###网络

端口号端口作用
22sshd服务端口
53DNS解析端口
80web服务端口

##框架与步骤设计 ###物理与开发环境

配置种类基础配置详细信息
物理配置腾讯云服务器 1核2G内存50G云硬盘1Mbps带宽
操作系统Ubuntu Server 18.04.1 LTSGNU/Linux4.15.0-54-genericx86_64

###docker框架

</table> ###项目搭建基本框架步骤 ####搭建Vue-Nginx服务器 1. 搭建Nginx服务器,实现简单页面浏览 2. 加入vue框架,并简单使用已经有的模板 3. 配置动静分离,将动态请求转至Apache-Django服务器(暂时实现/data的反向代理) 4. 实现并支持HTTPS ####搭建Apache-Django服务器 1. 搭建Apache服务器,将Django部署 2. 配置redis cache, 配置mysql数据库并进行访问 ####搭建数据库服务器 #####Redis服务器 1. 搭建redis服务器,并联入内网 #####Mysql服务器 1. 建立初始化数据库,并联入内网 ##基本个人环境配置 ###服务器编辑环境配置 |配置内容|执行命令|执行操作内容|备注事项| |---|---|---|---| |vim|apt-get install vim|\<确认\>|如无法下载, apt-get update| ||wget http://files.cnblogs.com/ma6174/vimrc.zip||ma6174的主题| ||unzip vimrc.zip||使用ls -a进行查看.vimrc文件| ||vim ~/.vimrc|打开syntax on
修改新标题文件补全|具体配置根据个人情况进行配置| ###服务器用户配置 |配置内容|执行命令|执行操作内容|备注事项| |:-:|---|---|---| |用户密码|passwd [username]|<用户原密码>
<新密码>
<重复输入>|密码复杂度要求 |主机名|sudo vim /etc/cloud/cloud.cfg|preserve_hostname: false => preserve_hostname: true|Ubuntu18.04| ||sudo vim /etc/hostname|\<old_hostname\> => \<new_hostname\>| ||sudo vim /etc/hosts|\<old_hostname\> => \<new_hostname\>| ||sudo reboot||可以执行exit,重新连接| ##开发环境配置 ###本机配置 |配置内容|执行命令|执行操作内容|备注事项| |---|---|---|---| |Anaconda|wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh||Anaconda3 Linux版本| ||sudo bash Anaconda3-2018.12-Linux-x86_64.sh|<确认>
<安装路径选择>
<配件>|| ||source ~/.bashrc||将conda加载入系统路径| |Django|pip install django||安装django| |ssl|sudo apt-get install openssl||| ||sudo apt-get install libssl-dev||| |Docker|curl -fsSL https://get.docker.com \| sh||CentOS与Ubuntu通用| |sysstat|sudo apt-get install sysstat||系统状态工具包 |vue|sudo apt install nodejs| ||sudo apt install npm| ||npm install -g @vue/cli| |svn|sudo apt install subversion||安装svn| ## autosort 项目内部环境配置 ###network配置daniel-net |配置内容|执行命令|执行操作内容|描述| |---|---|---|---| |network|docker network create -d bridge --subnet 172.25.0.0/16 daniel-net||创建网络| ###vue-nginx搭建 ####封装 deploy.sh 1. 构建vue项目(参考vue命令),将vue项目通过npm run build 打包 2. cp -r dist .. 3. 创建nginx.conf 4. 创建Dockerfile 5. cd .. && docker build -t vue:V1.0.0 . 6. sudo docker run -p 8849:80 -d --name vue-nginx vue:V1.0.0 7. docker network connect --ip 172.25.0.3 daniel-net vue-nginx 8. 配置文件 - nginx.conf[http版] ```nginx worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_max_body_size 20m; server { listen 80; server_name www.longdb.com;# 这里换域名 location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ``` - Dockerfile ```Dockerfile FROM vue-nginx:BASE MAINTAINER daniel doni COPY dist/ /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/ COPY Nginx/* /etc/nginx/ RUN echo 'echo init OK!' ``` ```sh container=vue-nginx image=vue if [ ! -n "$1" ];then echo project need a tag else tag=$1 running=`docker ps | grep $container` exist=`docker ps -a | grep $container` if [ "$running" ]; then docker stop $container && docker rm $container elif [ "$exist" ];then docker rm $container fi old=`docker images | grep $image | grep $tag` if [ "$old" ];then docker rmi $image:$tag fi docker build -t $image:$tag . docker run --name $container -d -p 80:80 -p 443:443 $image:$tag docker network connect --ip 172.25.0.3 daniel-net $container fi ``` ####添加SSL模块[http->https] 1. 确认ssl模块 ```sh nginx -V | grep with-http_ssl_module ``` 2. 修改nginx.conf[https版] ```nginx worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; client_max_body_size 20m; server { listen 443 ssl; server_name sigboom.cn; root /usr/share/nginx/html; #charset koi8-r; #access_log logs/host.access.log main; ssl_certificate /etc/nginx/1_sigboom.cn_bundle.crt; ssl_certificate_key /etc/nginx/2_sigboom.cn.key; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_timeout 5m; location / { index index.html index.htm; try_files $uri $uri/ /index.html; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy Python to Apache listening on 172.25.0.3:80 location /data { proxy_pass http://172.25.0.4:80; } location ~* \.(html|htm)$ { root /usr/share/nginx/html/static; expires 10d; } location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ { root /usr/share/nginx/html/static; expires 10d; } } server { listen 80; server_name sigboom.cn;# 这里换域名 return 301 https://$server_name$request_uri; } } ``` ####前端页面搭建 #####使用vue-cli进行搭建框架 1. 开放前端开发端口,使用vue的热更新方便前端开发 ```js //修改config/index.js dev:{ host: '0.0.0.0', //所有ip均可访问 post: 6170, //开放端口 } //修改build/webpack.dev.conf.js devServer: { disableHostCheck:true, //添加该行 } ``` 2. 使用vue router进行页面跳转,组件化编程
Public</td>Docker net [daniel-net]</td></tr>
Vue-Nginx 前端管理服务器
前端框架静态页面处理
VueNginx
Apache-Django 后台管理服务器
动态部署页面生成
ApacheDjango
数据库服务器
缓存Redis
磁盘Mysql
BASEvue-nginxapache-djangoredismysql
各版本及实现功能
V1.0.1支持vue支持HCJS支持本地服务</tr>
V1.0.2自动化部署
支持动静分离
V1.0.3支持HTTPS链接并调用数据库
组件结构
Header
MainIndexSign\_in
Sign\_up
Footer
3. 安装vuex 登录token [Vuex配置](https://segmentfault.com/a/1190000015637039) 4. 安装axios与后端交互 ###Apache-Django虚拟机配置[django] 1. 封装制作一级镜像[apache-django:BASE | REBASE]
基础镜像httpd:latest
配置内容执行命令
更新apt-getapt-get -y upgrade && apt-get update
python3前导包apt-get install -y wgte gcc make build-essential
apt-get install -y libncursesw5-dev libssl-dev
apt-get install -y libgdbm-dev libc6-dev libsqlite3-dev
apt-get install -y tk-dev libreadline-dev
apache链接django包apt-get install -y libapache2-mod-wsgi-py3
安装python3wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
tar xvf Python-3.6.8.tar.xz && cd Python-3.6.8
./configure && make && make install
rm -rf Python-3.6.8*
ln -s /usr/local/bin/python3 /usr/local/bin/python
ln -s /usr/local/bin/pip3 /usr/local/bin/pip
pip安装djangopip install --upgrade pip
pip install django pymysql django-redis
获取mod\_wsgi.socp mod_wsgi.so /usr/local/apache2/modules/
生成镜像apache-django:BASE
镜像Dockerfile ```Dockerfile FROM httpd:latest RUN apt-get -y upgrade && apt-get update RUN apt-get install -y wget gcc make build-essential libncursesw5-dev libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev libreadline-dev libapache2-mod-wsgi-py3 RUN wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz RUN tar xvf Python-3.6.8.tar.xz RUN cd Python-3.6.8 && ./configure && make && make install RUN rm -rf /usr/local/apache2/Python-3.6.8* RUN ln -s /usr/local/bin/python3 /usr/local/bin/python RUN ln -s /usr/local/bin/pip3 /usr/local/bin/pip RUN pip install --upgrade pip RUN pip install django pymysql django-redis cryptography COPY mod_wsgi.so /usr/local/apache2/modules/ ``` 2. 制作Dockerfile ```Dockerfile FROM apache-django:BASE MANTAINER "daniel <sigboom@163.com>" COPY httpd.conf /usr/local/apache2/conf/ COPY autosort.conf /usr/local/apache2/conf/extra/ COPY mysql-change/*.py /usr/local/lib/python3.6/site-packages/django/db/backends/mysql/ ``` 1. httpd.conf与autosort.conf配置
httpd.conf修改内容 ```sh # 200行添加 LoadModule wsgi\_module modules/mod_swgi.so #末尾添加 ServerName 172.25.0.4:80 include conf/extra/autosort.conf ``` autosort.conf ```sh WSGISocketPrefix /var/run/wsgi <VirtualHost *:80> # ServerName sigboom.cn:80 # RewriteEngine On # RewriteRule ^/(d-media|media|examples|screenshots)($|(\/(.*))) /app/project/$0 [L] DocumentRoot /autosort DirectoryIndex html/index.html WSGIScriptAlias / /autosort/autosort/wsgi.py <Directory /autosort/autosort> Require all granted AllowOverride none Require all denied </Directory> Alias /static/ /autosort/static/ <Directory /autosort/static> Require all granted </Directory> <Directory /autosort/> Order Allow,Deny allow From All Options Indexes FollowSymLinks </Directory> WSGIProcessGroup autosort WSGIApplicationGroup %{GLOBAL} #如果存在虚拟环境 # WSGIDaemonProcess autosort python-path=/usr/local/lib:/usr/local/bin WSGIDaemonProcess autosort CustomLog /autosort/logs/access.log combined ErrorLog /autosort/logs/error.log </VirtualHost> ``` 2. 修改配置autosort/autosort/wsgi.py ```py import sys sys.path.append('/usr/local/lib/python3.6/site-packages') curPath = os.path.abspath(os.path.dirname(__file__)) rootPath = os.path.split(curPath)[0] sys.path.append(rootPath) ``` 3. 修改autosort/autosort/setting.py ```py # 允许所有主机进行访问 ALLOWED_HOSTS = ['*'] ``` 4. 创建配置的相关文件夹 ```sh mkdir static mkdir logs python manage.py startapp data ``` 5. mysql-change下文件 ```py #base.py注释掉下面两行 if version < (1, 3, 13): raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__) #operations.py修改decode decode -> encode ``` 3. 封装deploy.sh ```sh container=apache-django image=django path=/home/daniel/Apache-Django if [ ! -n "$1" ];then echo project need a tag. else running=`docker ps | grep $container` exist=`docker ps -a | grep $container` if [ "$running" ]; then docker stop $container && docker rm $container elif [ "$exist" ];then docker rm $container fi old=`docker images | grep $image | grep $1` if [ "$old" ];then docker rmi $image:$1 fi docker build -t $image:$1 . docker run --name $container --net daniel-net --ip 172.25.0.4 -v $path/autosort:/autosort -d $image:$1 fi ``` ###redis虚拟机配置[redis-data] 1. 配置Dockerfile ```Dockerfile FROM redis:BASE ``` 2. 配置deploy.sh ```sh container=redis image=redis-data IP=172.25.0.2 CMD=redis-server if [ ! -n "$1" ];then echo project need a tag else running=`docker ps | grep $container` exist=`docker ps -a | grep $container` if [ "$running" ]; then docker stop $container && docker rm $container elif [ "$exist" ];then docker rm $container fi old=`docker images | grep $image | grep $1` if [ "$old" ];then docker rmi $image:$1 fi docker build -t $image:$1 . docker run --name $container --net daniel-net --ip $IP -d $image:$1 $CMD fi ``` ###mysql虚拟机配置[mysql-data] 1. 配置Dockerfile 1. 创建初始数据库 ```sql create database `autosort_db` default character set utf8 collate utf8_general_ci; use autosort_db; /* DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `email` varchar(255) DEFAULT NULL, `first_name` varchar(255) DEFAULT NULL, `last_name` varchar(255) DEFAULT NULL, `username` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; */ ``` 2. mysql初始化时将会执行/docker-entrypoint-initdb.d下sql文件 ```Dockerfile FROM mysql:BASE COPY init-sql/*.sql /docker-entrypoint-initdb.d/ ``` 2. 配置deploy.sh ```sh container=mysql image=mysql-data IP="--ip 172.25.0.5" Net="--net daniel-net" ENV="-e MYSQL_ROOT_PASSWORD=password" CMD="" if [ ! -n "$1" ];then echo project need a tag else running=`docker ps | grep $container` exist=`docker ps -a | grep $container` if [ "$running" ]; then docker stop $container && docker rm $container elif [ "$exist" ];then docker rm $container fi old=`docker images | grep $image | grep $1` if [ "$old" ];then docker rmi $image:$1 fi docker build -t $image:$1 . docker run --name $container $Net $IP -d $ENV $image:$1 $CMD fi ``` ###TensorFlow 1. ubuntu-drivers devices sudo apt install ubuntu-drivers-common |CUDA| |---| |wget https://developer.nvidia.com/compute/cuda/10.0/Prod/ local_installers/cuda-repo-ubuntu1804-10-0- local-10.0.130-410.48_1.0-1_amd64| |mv cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64 cudarepo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb |sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb |sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub |sudo apt-get update |sudo apt-get install cuda |虚拟机无实际显卡无法安装| |Cudann 2. tensorboard 远程连接并在本地通过127.0.0.1访问 ```sh ssh -L 16006:127.0.0.1:6006 daniel@TencentCloud ``` ##命令使用 ###本地命令
实现功能命令
登录远程服务器ssh ${username}@${public_IP}
####Github命令
命令均以git开头
命令参数参数意义命令意义
status查看本地仓库状态
add [File]--all所有文件将文件添加至缓存区
commit{-m [tag]}添加提交tag提交改变给本地仓库
push-f强制提交将本地仓库推送至Github服务端
-u [branch]推送到指定分支
默认[origin master]
pull从Github服务端拉取最新版本
log--oneline简化默认的输出查看历史版本
--pretty=[mode]自定义输出的信息git log --pretty=oneline
reset--hard [git-ID]重置索引与工作树回退到历史版本
###服务端命令 ####系统命令 |命令|参数|参数意义|命令意义| |---|---|---|---| |tar|zxvf \| zcvf \| czvp\| -f |解压缩\|压缩|压缩| |split|-b 45m [tar-file] [split-name]||文件切分| |reboot|||重启服务器| |htop|||查看系统情况| |systemctl|start docker||开启docker服务| ||status docker||查看状态| |apachectl|start\|restart\|stop||开启\|重启\|停止Apache服务| |curl|icanhazip.com|访问特定网址|获取公网IP| |nmap|-Pn -p[port] [IP]||查看端口状态与服务信息| |nohup|[command] &|将程序以忽略挂起信号的方式运行起来|终端无输出运行命令(ssh退出也不中断)| |nohup|[command] > [file] 2>&1 &|运行起来后输出到指定文件|后台运行命令(ssh退出也不中断)| |ctrl + z|||可以将一个正在前台执行的命令放到后台,并且处于暂停状态。 |fg|||将后台任务切换到前台执行 |bg|[num]|将选中的命令调出|将一个在后台暂停的命令,变成在后台继续执行 |jobs|-l|显示所有任务的PID|查看后台运行的状态 |lspci| ||检查显卡 ####Docker命令 **命令均以docker开头,必要时请添加权限提升命令sudo**
命令参数参数意义命令意义
--version查看docker版本
run [image_name]-dit | -d在后台运行从镜像启动容器
--name [container]命名容器
--net [net]定义容器网络
--ip [IP]定义容器IP
-p [server_port]:[container_port]定义端口映射
-v [server_path]:[container_path]定义挂载映射
exec [container] [order]-it以终端方式运行在容器中运行命令
search [image_name]查找镜像文件
pull [image]拉取镜像文件
rename [container] [new_container]容器重命名
ps-a查看所有状态默认为运行的容器
start | restart | stop | rm [container]启动 | 重启 | 停止 | 删除 容器
rmi [image_name]删除镜像
commit [container] [new_image]-m [commit_msg]提交标签从容器创建镜像
-a [author]标记创建者
tag [image_id] [image]:[image_tag]修改镜像标签
save [image]-o [tar_name].tar保存镜像的文件名导出镜像
#####Docker Management Commands
命令参数子参数子参数意义参数意义
networkls列出本机网络
create [net] -d bridge | host | none网络模式创建网络
--subnet [IP_head]/[IP_room]设定网段
connect [net] [container]将容器加入网络
disconnect [net] [container]将容器断开网络
inspect [net]查看网络内情况
rm [net]删除网络
#####Dockerfile
关键词意义
FROM [image]从该镜像生成镜像
MAINTAINER [author [email]]为镜像添加作者(email)
COPY [File][container-path]从本机拷贝文件到容器
####mysql命令 </tr> </table> ####pyenv命令 |命令|意义| |---|---| |pyenv global 3.6.4|切换当前系统环境| ####Anaconda命令 |命令|意义| |---|---| |conda create -n \<env\_name\> python=\<version\_num\>|python版本控制| |conda activate autosortsys|激活环境| |conda remove -n \<env\_name\> --all|删除环境| ####django命令 |命令|意义|路径要求| |---|---|---| |django-admin startproject \<pro\_name\>|创建一个django工程| |python manage.py runserver \<host\_ip\>:\<host\_port\>|开启简易web程序|工程目录下| |python manage.py startapp app_name|在工程目录下创建app|工程目录下| |python manage.py makemigrations [app]&&
python manage.py migrate [app]|更新[app]数据库模型(默认为all)|工程目录下| ####vue命令 |命令|意义|备注| |---|---|---| |vue init webpack |创建vue项目| |cnpm install|安装项目依赖|在项目目录下| |npm run build|打包项目,生成dist目录|在项目目录下| ##其他问题 |问题|现象|解决方法| |---|:-:|---| |系统Python版本问题|不支持高版本操作|安装高版本并配置系统软连接| ||步骤:|cd Python-3.6.4/
./configure --prefix=\<sys_path=\usr\local\Python-3.6.4\>
make && make install
ln -s <old_version_file=/usr/local/bin/>| |https服务开启问题|服务器显示服务无效|同时监听80端口与443端口| |https服务资源加载问题|所有页面内部资源404|https服务页面所有资源的请求形式为https://资源URL,注意修改客户端文件结构与服务端文件结构的对应| |django加载mysql|运行有错误|| ||vim \_\_init\_\_.py|import pymysql
pymysql.install\_as\_MySQLdb()| ||vim /usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py|#if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.\_\_version\_\_)| ||vim /usr/local/lib/python3.6/site-packages/django/db/backends/mysql/operations.py|decode -> encode| |CSRF verification failed|403错误|axios.interceptors.request.use((config) =>{config.headers['X-Requested-With'] = 'XMLHttpRequest';let regex = /.*csrftoken=([^;.]*).*$/; // 用于从cookie中匹配 csrftoken值config.headers['X-CSRFToken'] = document.cookie.match(regex) === null ? null : document.cookie.match(regex)[1];return config});| |检查端口被占用|无法监听端口|$ **sudo** netstat -tunpl \| grep 80
$ **sudo** kill [pid]| |nginx配置文件检测|docker搭建nginx服务器时无法启动|docker run -it [images]
nginx -t| |npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.2.11|Vue Mac操作系统的工具包在Win或Linux系统下使用,会报警告,去除警告执行命令|$ npm install --no-optional| |错误记录:(fields.E304) Reverse accessor for '' clashes with reverse accessor for ''.|两个属性都关联一个外键 应该加一个related_name|访问外键时使用related_name进行访问 |docker启动不起来|查看相关服务器配置文件|
级别类别命令参数参数意义目的
系统登录mysql-u[user] -p以[user]登录登录数据库
-h[IP]服务器IP默认localhost
--port=[server_port]服务器端口默认3306
用户管理create user '[user]' identified by '[passwd]';创建用户[user]
grant all privileges on *.* to '[user]'@'[IP]' identified by '[passwd]' with grant option;授权[user]允许[IP]以[passwd]管理所有表并刷新
flush privileges;
drop user [user]@[IP];删除用户
数据库show databases;打印数据库列表
数据库show tables;打印表格信息
插入insertinto [table] ({field...}) values ([value...])无{field...}插入所有数据指定列插入数据
删除deletefrom [table]删除全部删去表内信息
where [condition]约束条件
修改update[table] set ({field = value}..)修改field的值为value修改表格数据
where [condition]约束条件
查询show columnsfrom [table]打印表头信息
desc [table]打印表结构
select [key] [alias], [key]from [table]打印表内信息
where [condition]约束条件
备注必要参数