常用工具与配置

1 git

      SVN

2 虚拟环境

3 豆瓣源&生成项目依赖包(查看安装包版本)

4 Conda环境管理

5 linux启动项目(nginx,防火墙)

6 local-settings.py

7 django乱码

9 Pyinstaller打包为exe文件

10 os+datetime创建文件夹

11 sshkey

12 端口测试命令(wget,curl,telnet,ssh,tcping)

13 Github 使用技巧 

14 md5sum

15 speedtest-cli(网速测试)

 

包工具:

1 nvm(nodejs) -npm

 

 其他菜鸡:

1 管理员身份运行(纯键盘模式)

2 bat文件(批量修改后缀名)

1. git

官网链接:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

文档参考:https://zhuanlan.zhihu.com/p/30355251

 

############git ############
文档参考:https://zhuanlan.zhihu.com/p/30355251

git config #
git config --global -l #查看当前用户配置
git config --global user.name "xxx" #名称
git config --global user.email "xxx"  #邮箱

git status [filename] 查看指定文件状态

branch
git branch -a  #查看所有分支
git branch -r  #查看远程分支
git branch  #查看本地分支

git branch [branch-name] #新建分支,但停留在当前分支
git checkout -b [branc-name] #新建分支,并切换到该分支

git clone -b dev开发分支 https://github.com/521/springboot-rabbitmq.git //clone指定分支,不指定默认为master
git checkout -b dev origin/dev #本地已有项目下拉取远程分支:dev是本地分支, origin/dev 是远程分支
git checkout -- . # 让工作区中的所有文件撤销更改

git branch -d xxx#删除本地分支
git push origin --delete xxx #删除远程分支

git merge [branch] #合并指定分支到当前分支

版本
 git reflog #查看之后log
 git log #查看之前log
 git log --pretty=oneline #格式化log形式

 git reset --hard #查看当前版本
 git reset --hard commit-id #回退版本

tag标签
git tag -a v1 -m "my version 1" #创建标签 (为当前提交创建一个标签,标签名为v1.0,-m就是该标签的附注信息)
git log --pretty=oneline #查看历史版本
git tag -a v1.2 9fceb02 #给过去版本打标签

git tag #列出标签
git tag -l "v1.8.5*" #特定的模式查找标签

git show v1 #展示标签与之对应的提交信息

git push origin v1.5 #推送单个标签
git push origin --tags #推送所有标签

git tag -d v1.4-lw #删除本地标签
git push origin --delete <tagname> #删除远程标签
git_wzt

 

############git ############

git config #
git config --global -l #查看当前用户配置
git config --global user.name "xxx" #名称
git config --global user.email "xxx"  #邮箱

git status [filename] 查看指定文件状态

branch
git branch -a  #查看所有分支
git branch -r  #查看远程分支
git branch  #查看本地分支

git branch [branch-name] #新建分支,但停留在当前分支
git checkout -b [branc-name] #新建分支,并切换到该分支
git checkout -- . # 让工作区中的所有文件撤销更改 git clone
-b dev开发分支 https://github.com/521/springboot-rabbitmq.git //clone指定分支,不指定默认为master git checkout -b dev origin/dev #本地已有项目下拉取远程分支:dev是本地分支, origin/dev 是远程分支 git branch -d xxx#删除本地分支 git push origin --delete xxx #删除远程分支 git merge [branch] #合并指定分支到当前分支 版本 git reflog #查看之后log git log #查看之前log
 git log --pretty=oneline #格式化log形式 git reset
--hard #查看当前版本 git reset --hard commit-id #回退版本

tag标签
git tag -a v1 -m "my version 1" #创建标签 (为当前提交创建一个标签,标签名为v1.0,-m就是该标签的附注信息)
git log --pretty=oneline #查看历史版本
git tag -a v1.2 9fceb02 #给过去版本打标签

git tag #列出标签
git tag -l "v1.8.5*" #特定的模式查找标签

git show v1 #展示标签与之对应的提交信息

git push origin v1.5 #推送单个标签
git push origin --tags #推送所有标签

git tag -d v1.4-lw #删除本地标签
git push origin --delete <tagname> #删除远程标签

 

# 查看当前所在版本
git reset --hard
# 查看git 相关配置
vim .git/config
# 去除git版本控制 find . -name ".git" | xargs rm -Rf
# git修改远程仓库地址(先删后加)  git remote rm origin
git remote add origin url
git init git add git commit git log git reflog git reset
--hard 版本号 1. 取别名 git remote add origin 地址 2. 推送代码 git push -u origin 分支 git pull origin dev 3 看看远端仓库信息 git remote -v pycharm 使用GIt 1 clone代码 VCS---->Get from Version Control-->URL(复制远程地址) 2 进行编辑代码 3Commit 提交代码,生成版本 4 推送代码 VCS-->git-->Push(快捷键Ctrl +Shift+K) 5 拉取代码
# pycharm
.idea/
.DS_Store

__pycache__/
*.py[cod]
*$py.class

# Django stuff:
local_settings.py
*.sqlite3

# database migrations
*/migrations/*.py
!*/migrations/__init__.py
.gitignore
全局User配置(只用操作一次)
git config --global user.name "your_Name"
git config --global user.email "your_email"

初始化本地Git仓库
git init

绑定远程仓库
git remote add origin 远程仓库地址

将所有文件添加到暂存区
git add *

将暂存区的文件添加到本地仓库
git commit -m "注释"

将远程仓库和本地仓库合并(如果合并失败整理好再push 或者 强制push)
git pull origin master --allow-unrelated-histories

将本地仓库推送到远程仓库(-u 跟踪分支 -f 强制推送)
git push -u origin master 
git push -f origin master
git正常推送步骤

1 查看更多详情

 2 KSS(狂神)

 

2. 虚拟环境

# 以管理员身份启动 cmd

C:\>cd C:\ProgramData\Anaconda3

C:\ProgramData\Anaconda3>cd Scripts

C:\ProgramData\Anaconda3\Scripts>activate
管理员身份激活conda环境

 

虚拟环境 virtualenv

1.安装
pip install virtualenv
pip install virlualenv -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2.创建虚拟环境
virtualenv 环境名称
# 注意 :创建【环境名称】文件夹,放置所有的环境,进入指定目录 D:/envs
示例:假设电脑 py27 / py36
virtualenv s28(环境名称) --python=python3.6
#virtualenv s28(环境名称) --python=python2.7

3 激活 、退出虚拟环境
打开终端 ,找到s28
win:
    cd Scripts # 进入虚拟环境 Scripts目录
    activate  #激活虚拟环境
    deactivate #Scripts目录,退出虚拟环境 
    
mac:
    source s25/bin/activate
    deactivate #任意目录 退出虚拟环境 

4 在虚拟环境种安装模块
pip3 install django==1.11.7 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

 

3.豆瓣源&生成项目依赖包

  # 检测某个模块包是否安装
   python -c "import channels; print(channels.__version__)"


--生成所需安装包 pip freeze > requirements.txt --安装所需包 pip install -r requirements.txt --豆瓣源&清华源 pip install -i http://pypi.douban.com/simple/ sayhi --trusted-host pypi.douban.com #sayhi是模块名
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源 - 安装 pip3 install pipreqs -执行相关命令 - 生成依赖文件:pipreqs ./ - 安装依赖文件:pip3 install -r requirements.txt #如果出现编码格式错误: UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 776: illegal multibyte sequence ###解决方法在命令后面指定编码格式: pipreqs ./ --encoding=utf8

 

4. Conda环境管理

安装Miniconda:https://zh-v2.d2l.ai/chapter_installation/index.html

安装流程:

 

网址:https://conda.io/en/latest/miniconda.html

wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh #下载脚本

sh Miniconda3-py39_4.12.0-Linux-x86_64.sh # 执行

~/miniconda3/bin/conda init #初始化Shell,以便直接运行conda

conda create --name d2 python=3.9  #关启shell,创建虚拟环境
conda activate d2 #激活 d2环境

 

 

Conda的环境管理

1创建环境
# 创建一个名为python34的环境,指定Python版本是3.5(不用管是3.5.x,conda会为我们自动寻找3.5.x中的最新版本)
conda create --name py35 python=3.5

2激活环境

# 安装好后,使用activate激活某个环境
activate py35 # for Windows
source activate py35 # for Linux & Mac
(py35) user@user-XPS-8920:~$
 # 激活后,会发现terminal输入的地方多了py35的字样,实际上,此时系统做的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH

(py35) user@user-XPS-8920:~$ python --version
Python 3.5.5 :: Anaconda, Inc.
# 可以得到`Python 3.5.5 :: Anaconda, Inc.`,即系统已经切换到了3.5的环境

3 返回主环境
# 如果想返回默认的python 2.7环境,运行
deactivate py35 # for Windows
source deactivate py35 # for Linux & Mac

4删除环境
# 删除一个已有的环境
conda remove --name py35 --all

5 查看系统中的所有环境
用户安装的不同Python环境会放在~/anaconda/envs目录下。查看当前系统中已经安装了哪些环境,使用conda info -e。

user@user-XPS-8920:~$ conda info -e
# conda environments:
#
base                  *  /home/user/anaconda2
caffe                    /home/user/anaconda2/envs/caffe
py35                    /home/user/anaconda2/envs/py35
tf                       /home/user/anaconda2/envs/tf

6 Conda的包管理

-安装库
为当前环境安装库
conda install numpy
# conda会从从远程搜索numpy的相关信息和依赖项目

-查看已经安装的库
# 查看已经安装的packages
conda list
# 最新版的conda是从site-packages文件夹中搜索已经安装的包,可以显示出通过各种方式安装的包

-查看某个环境的已安装包
# 查看某个指定环境的已安装包
conda list -n py35

搜索package的信息
# 查找package信息
conda search numpy
Loading channels: done
# Name                  Version           Build  Channel             
numpy                     1.5.1          py26_1  pkgs/free           

...

numpy                    1.15.1  py37hec00662_0  anaconda/pkgs/main  
numpy                    1.15.1  py37hec00662_0  pkgs/main

-安装package到指定的环境
# 安装package
conda install -n py35 numpy
# 如果不用-n指定环境名称,则被安装在当前活跃环境
# 也可以通过-c指定通过某个channel安装

-更新package
# 更新package
conda update -n py35 numpy

-删除package
# 删除package
conda remove -n py35 numpy

-更新conda
# 更新conda,保持conda最新
conda update conda
更新anaconda

-# 更新anaconda
conda update anaconda
 ```
-### 更新Python
更新python
conda update python

假设当前环境是python 3.5, conda会将python升级为3.5.x系列的当前最新版本
设置国内镜像
因为http://Anaconda.org的服务器在国外,所有有些库下载缓慢,可以使用清华Anaconda镜像源。 网站地址: 清华大学开源软件镜像站



Anaconda 
镜像 Anaconda 安装包可以到 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载。 TUNA还提供了Anaconda仓库的镜像,运行以下命令:


conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 
conda config --set show_channel_urls yes


即可添加 Anaconda Python 免费仓库。

运行 conda install numpy 测试一下吧。

Miniconda 镜像
Miniconda 是一个 Anaconda 的轻量级替代,默认只包含了 python 和 conda,但是可以通过 pip 和 conda 来安装所需要的包。

Miniconda 安装包可以到 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 下载。
Conda相关命令
1 conda启动cmd启动
处理过程:使用utools搜索Anacondas3-->找到Anaconda Prompt (Anaconda3).lnk-->找到源文件右键属性找到目标
C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3  
cmd启动conda原理

 

conda常用命令 

conda info --envs 查看conda环境下所有的虚拟环境

conda create -n 虚拟环境名字 python=3.6 #创建虚拟环境 conda activate 虚拟环境名字 #激活虚拟环境 conda deactivate #退出虚拟环境

conda list #查看当前虚拟环境里已经安装的库
conda remove -n aotu --all # 删除虚拟环境

conda install uwsgi -c conda-forge # -c conda-forge(当前pkgs找不到时可以加上此参数)

conda config --show channels #查看镜像源
conda config --remove-key channels #移除镜像源

 #添加镜像源

 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
 conda config --set show_channel_urls yes

说明:windows 创建虚拟环境,需要在conda base环境下,否则报错!

其他conda-forge...)

conda install uwsgi -c conda-forge  # -c conda-forge(当前pkgs找不到时可以加上此参数)

 

 

5.Linux启动项目

#####linux-----cnblog#####
##测试环境下启动
1 上传代码--创建虚拟环境
cd /usr/src/cnblog # 代码存放位置
cd /python_venv
virtualenv --python=python3 cnblog_env
2启动虚拟环境
alias cnblog_venv='source /python_venv/cnblog_env/bin/activate'
#alias start_cnblog='python /usr/src/s25/manage.py runserver 0.0.0.0:9000'
3安装相应的模块
pip3 freeze  > requirements.txt
pip3 install -i https://pypi.douban.com/simple  -r  requirements.txt   
#或者手动安装
pip3 install -i https://pypi.douban.com/simple django==3.1.7
pip3 install -i https://pypi.douban.com/simple pymysql
pip3 install -i https://pypi.douban.com/simple Pillow
pip3 install -i https://pypi.douban.com/simple bs4
4 安装并启动mysql
 yum install mariadb-server  mariadb -y
 systemctl start mariadb

5 导入导出数据
数据从window中导出
mysqldump -uroot -p --databases cnblog > cnblog.sql
linux导入数据
mysql -uroot -p  <  /opt/alldb.sql


6启动项目
alias start_cnblog='python /usr/src/cnblog/manage.py runserver 0.0.0.0:9000'
start_cnblog

##uwsgi启动
让你的django在linux上,支持并发形式启动,支持多进程,多线程,乃至于协程的一个C语言编写的高性能工具
1.安装uwsgi工具
pip3 install -i https://pypi.douban.com/simple  uwsgi

2.编写uwsgi.ini配置文件,以多进程形式启动tf_crm
touch uwsgi.ini  #手动创建此uwsgi的配置文件,写入如下的内容参数,去启动crm   (在项目目录下/usr/src/cnblog创建)
# 写入如下的功能性的参数配置,用于启动项目
# 这些部署的流程,是国外的uwsgi官网,给与的用法,我们照着用即可
# 注意要根据你自己的目录,修改如下的参数

[uwsgi]
# Django-related settings
# the base directory (full path)
#  填写crm项目的第一层绝对路径
chdir           = /opt/tf_crm/
# Django's wsgi file
# 填写crm项目第二层的相对路径,找到第二层目录下的wsgi.py
# 这里填写的不是路径,是以上一个参数为相对,找到第二层项目目录下的wsgi.py文件
module          = tf_crm.wsgi
# the virtualenv (full path)
# 填写虚拟环境解释器的第一层工作目录 
home            = /opt/tf_crm/venv_crm
# process-related settings
# master
master          = true
# maximum number of worker processes
# 代表定义uwsgi运行的多进程数量,官网给出的优化建议是 2*cpu核数+1 ,单核的cpu填写几?
# 如果是单进程,十万个请求,都丢给一个进程去处理
# 3个工作进程,十万个请求,就分给了3个进程去分摊处理
processes       = 3

# the socket (use the full path to be safe
# 这里的socket参数,是用于和nginx结合部署的unix-socket参数,这里临时先暂停使用
# socket          = 0.0.0.0:8000
#  线上不会用http参数,因为对后端是不安全的,使用socket参数是安全的连接,用nginx反向代理去访问
# 后端程序是运行在防火墙内部,外网是无法直接访问的
# 临时使用http参数,便于我们用浏览器调试访问
http =  0.0.0.0:8000

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true


3.此时可以用命令,基于uwsgi协议的一个高性能web后端启动了
uwsgi  --ini  ./uwsgi.ini  #指定配置文件启动后端

4.此时crm项目,已经用uwsgi支持了3个进程的启动了,但是由于uwsgi对静态文件的解析性能很弱,线上是丢给nginx去处理的


#####使用supervisor进行管理########
8.uwsgi和uwsgi.ini都配置完毕之后,开始使用supervisor工具进行管理了
- 1.使用yum命令即可直接安装
[root@s25linux ~]# yum install  supervisor -y

- 2.生成supervisor的配置文件
[root@s25linux ~]# echo_supervisord_conf >  /etc/supervisord.conf

先明确,启动uwsgi的绝对路径命令是什么
    8.1   找到uwsgi的绝对路径 /python_venv/cnblog_env/bin/uwsgi    # which uwsgi
    8.2  找到uwsgi.ini的绝对路径    /usr/src/cnblog/uwsgi.ini  
    8.3   因此 启动 crm项目的 完整绝对路径命令是
             /python_venv/cnblog_env/bin/uwsgi     --ini    /usr/src/cnblog/uwsgi.ini  

9.修改supervisor的配置文件
vim  /etc/supervisord.conf #写入如下 (大写G跳到最底层)

[program:cnblog]
command=/python_venv/cnblog_env/bin/uwsgi     --ini    /usr/src/cnblog/uwsgi.ini    ;supervisor其实就是在帮你执行命令而已!
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true     ;默认为false,向进程组发送kill信号,包括子进程


10.启动supervisor,默认就会直接启动uwsgi了 
supervisord -c /etc/supervisord.conf   #启动supervisor服务端,指定配置文件启动

启动完毕supervisor之后,检查进程信息

ps -ef|grep  supervisor #检查supervisor是否存在了进程,是否启动
ps -ef|grep  uwsgi  #检查uwsgi是否启动

11.supervisor任务管理终端
supervisorctl -c /etc/supervisord.conf

看到如下的结果,表示你自定义的任务s25crm,也就是uwsgi进程,正确的启动了
(venv_crm_again) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
s25crm                           RUNNING   pid 41451, uptime 0:01:34
supervisor>

12.看到了没有静态文件的 crm界面,就是正确的了

13.supervisorctl的管理命令

提供了如下命令
(venv_crm_again) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
s25crm                           RUNNING   pid 41451, uptime 0:01:34
supervisor>
supervisor>start s25crm
supervisor>stop s25crm 
supervisor>status 
supervisor>start all 
supervisor>stop all 

14.uwsgi异常崩溃的话,supervisor会立即重启uwsgi

15.如果要运行多个 uwsgi项目,在supervisor中定义多个任务即可

16 此时配置好nginx.conf就完事了,修改如下,配置nginx,请求转发给后台即可
    server {
        listen       80;
        server_name  localhost;
        #这是一个局部的变量,只对当前这个server{}代码块生效,编码设置为utf-8

        charset utf-8;
        error_page  404  /40x.html;
        # 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
        # 基于uwsgi协议的一个高性能的反向代理转发,新的参数
        location / {
        #当请求发送给  192.168.178.140:80的时候
        #通过uwsgi_pass把请求转发给后端的uwsgi服务器
        uwsgi_pass   0.0.0.0:8000;
        #这个参数,是固定的,是添加一些转发请求头内容
        include uwsgi_params;
        }

}
18.重启nginx
nginx -s reload


18.1  此时发现静态文件丢失,例如如下的静态文件

http://192.168.178.143/static/js/common.js
http://192.168.178.143/static/css/style.css
http://192.168.178.143/static/js/jquery.validate.min.js


19.还得配置nginx接收所有的django静态文件,修改命令如下
第一步:修改django的配置文件,收集所有的静态文件,放入一个统一管理的目录
vim settings.py  #添加如下内容
STATIC_ROOT='/s25static/'   #作用是定义一个统一管理的目录,收集所有crm的静态文件

第二步:用命令收集静态文件
python3 manage.py collectstiac

20.通过nginx去找到如下的静态文件即可


###小知识:supervisor工具的介绍与安装####
--supervisor工具
目前你所学的linux技能
对crm的进程进行管理,启停

ps -ef|grep python3  
ps -ef|grep  uwsgi  #检查uwsgi的进程,确认django是否存活,假如检测到pid是  5999

停止uwsgi,kill -9  5999 


#检测uwsgi如果挂掉之后,自动帮你重启
#使用supervisor这个python开发的进程管理工具,用它启动uwsgi之后,uwsgi进程挂掉后,自动会再启动 


比如,crm的部署技术栈
nginx+uwsgi+django+mysql  ,我们可以手动的,单独启动每一个进程 

还可以通过supervisor一键启动这四个进程,进行批量管理,批量启停 ,很好用

----安装supervisor工具

1.使用yum命令即可直接安装
[root@s25linux ~]# yum install  supervisor -y

2.生成supervisor的配置文件
[root@s25linux ~]# echo_supervisord_conf >  /etc/supervisord.conf

3.修改supervisor的配置文件,添加管理crm的任务
vim  /etc/supervisor.conf #再最底行,添加如下内容

#[program:xx]是被管理的进程配置参数,xx是进程的名称

[program:s25crm]
command=写入启动uwsgi的命令  ;supervisor其实就是在帮你执行命令而已!
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true     ;默认为false,向进程组发送kill信号,包括子进程

nginx   官方nginx
tenginx  淘宝nginx

这2个一模一样,淘宝的nginx,官方文档更详细
#小知识:
---如果你想删除 编译安装的软件  1,清空PATH  2,删除文件夹即可
---linux命令:curl -I baidu.com # 对百度发起请求
---查询端口 netstat -tunlp|grep 80


#####eginx#######
注意,编译软件之前,还是需要解决系统的开发环境,例如如下
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    
1.进入淘宝nginx官网,下载源代码,进行编译安装
http://tengine.taobao.org/index_cn.html

2.在linux的opt目录下,下载nginx源代码
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz

3.解压缩源代码,准备编译三部曲
[root@s25linux opt]# tar -zxvf  tengine-2.3.2.tar.gz

4.进入源码目录,指定nginx的安装位置
[root@s25linux tengine-2.3.2]# ./configure --prefix=/opt/tngx232/

5.编译且编译安装,生成nginx的可执行命令目录
make && make install 

6.安装完毕后,会生成/opt/tngx232/文件夹,nginx可以使用的配置都在这里了
[root@s25linux tngx232]# ls
conf  html  logs  sbin

conf  明显是存放*.conf配置文件的
html  存放网页的静态文件的目录
logs  日志
sbin  存放nginx的可执行命令 


7.添加nginx到PATH中,可以快捷执行命令

永久修改PATH,开机就去读
vim /etc/profile  
写入PATH="/opt/tngx232/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
source /etc/profile

8.首次启动nginx,注意要关闭防火墙
直接输入nginx命令即可启动
有关nginx的命令

nginx                         #首次输入是直接启动,不得再次输入 
nginx -s reload  #平滑重启,重新读取nginx的配置文件,而不重启进程
nginx -s stop      #停止nginx进程 
nginx -t   #检测nginx.conf语法是否正确

9.默认访问nginx的首页站点url是
http://192.168.178.140:80/index.html


示例访问:

http://49.235.88.178:80/  sass (使用nginx+uwsgi)
http://49.235.88.178:9001/   cnblog(使用uwsgi)
View Code

防火墙(查看与禁用) 

systemctl status firewalld #查看防火墙

systemctl stop firewalld #关闭firewalld服务
systemctl disable firewalld #禁止开机自启

systemctl stop iptables  #关闭iptables
systemctl disable iptables  #禁止开机自启

vi /etc/selinux/config #禁用selinux 
SELINUX=disabled

nginx配置文件示例(saas密码:huawang12)

1.which nginx # 找到nginx --->/opt/tngx232/sbin/nginx
whereis nginx
2.cd /opt/tngx232 3 ls 4 cd conf #cd到conf目录下 5 ls-->vim nginx.conf #编辑nginx配置文件
6 nginx常用命令:
  1. cd /usr/local/nginx/sbin/
  2. ./nginx 启动
  3. ./nginx -s stop 停止
  4. ./nginx -s quit 安全退出
  5. ./nginx -s reload 重新加载配置文件
  6. ps aux|grep nginx 查看nginx进程
--示例:
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;
    #access_log  "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G"  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #  # 用upstream关键词定义负载均衡池,写入资源服务器的地址
    #      # 负载均衡的算法,默认是轮询机制,一台服务器处理一次 
    upstream  s25real_server  {

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";

#pid        logs/nginx.pid;


events {
    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;
    #access_log  "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G"  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #  # 用upstream关键词定义负载均衡池,写入资源服务器的地址
    #      # 负载均衡的算法,默认是轮询机制,一台服务器处理一次 
    upstream  s25real_server  {
          server   49.235.88.178:85;
          server   49.235.88.178:90;
}
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;

       location / {
          #当请求发送给  192.168.178.140:80的时候
           #通过uwsgi_pass把请求转发给后端的uwsgi服务器
             uwsgi_pass   0.0.0.0:8001;
          #  #这个参数,是固定的,是添加一些转发请求头内容
             include uwsgi_params;
           # proxy_pass http://49.235.88.178:85;  
           # proxy_pass  http://s25real_server;
            # root   html;
            # root   /s25python/;
            #index  index.html index.htm;
        }

        #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;
        }
        location  /static {
        alias       /s25static;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
# 这里是第二个虚拟主机的配置了
 server  {
 listen 85;
 server_name  _;
# #nginx的域名匹配
# # 当用户访问 192.168.178.140:89的时候,返回该目录的内容
location  / {
  root   /s25python/;
  index  index.html;
  error_page  404  /40x.html;
            }

           }

# 这里是第三个虚拟主机的配置了
 server  {
   listen 90;
   server_name  localhost_;
#    # #nginx的域名匹配
#    # # 当用户访问 192.168.178.14.90的时候,返回该目录的内容
#
    location  / {
      #xmall 商城项目 
        try_files $uri $uri/ /index.html;  #匹配所有的路由
                 root /tmp/dist; #填写前端的根目录
            index  index.html index.htm;}
        }

}
nginx配置示例
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
防火墙firewalld

nginx演示

upstream lb{
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=1;
}
location / {
    proxy_pass http://lb;
}

部署前后端分离项目(xmall为例)

### 上线部署

#服务器准备
www.pyhonav.cn

阿里云买台服务器

**登录服务器**

`用户名:ssh root@49.235.88.178`

`密码:xxxx`

------

**1 安装node*

`cd /opt/`

`wget https://nodejs.org/download/release/v10.15.3/node-v10.15.3-linux-x64.tar.xz `

**2 解压node**

`xz -d node-v10.15.3-linux-x64.tar.xz ` :去除掉.xz后缀

`tar -xf node-v10.15.3-linux-x64.tar `

**3配置环境变量**(echo $PATH)

```js
在/etc/profile最后一行添加
export PATH=/opt/node-v10.15.3-linux-x64/bin/node:/opt/node-v10.15.3-linux-x64/bin/npm:$PATH
然后
source /etc/profile
```

**4 安装pm2进程管理工具**

```js
1 npm install pm2 -g  (全局安装)
2 ln -s /opt/node-v10.15.3-linux-x64/lib/node_modules/pm2/bin/pm2 (创建软连接)
3 pm2 list  (查看进程)  pm2 -v (查看版本)
4 pm2 start npm --name "my-nuxt" -- run start (启动,引号内是线程名)
5 pm2 delete my-nuxt (结束进程)
```



**5 部署后端代码(node)**
项目所在目录 :/tmp/server

cd /tmp/server
启动:pm2 start app.js

- `git pull https://www.github.com/xiaomage/server`
- 模拟本地文件上传到服务器
  - 本地终端运行:`scp ./server.zip root@49.235.88.178:/tmp`
  - 服务器终端运行:`unzip server.zip && cd server && npm install && pm2 start app.js`
  - 访问:http://49.235.88.178:3000/api/goods/home 

**6 部署Vue前端项目**

前端打包文件:

```js
npm run build
```

- 本地终端运行:`scp ./dist.zip root@49.235.88.178:/tmp`

- 服务器终端运行:`unzip dist.zip`


**7 部署nginx**

找到nginx的安装目录

```js
//以我的服务器为例:nginx目录
cd /opt/ngx112/conf 
vim nginx.conf

//修改配置文件如下
 server {
        listen       80; //端口号
        server_name  www.pythonav.cn; //域名
        location / {
                 try_files $uri $uri/ /index.html;  #匹配所有的路由
                 root /tmp/dist; //填写前端的根目录
            index  index.html index.htm;
        }
    }
```

输入nginx的启动命令

```
nginx 第一次输入是启动
nginx -s reload  #平滑重启,重新读取配置文件,不重启进程
nginx -s stop
```

访问http://www.pythonav.cn 查看xmall商城项目(测试:http://49.235.88.178:90/)

![image-20191118151652251](assets/image-20191118151652251.png)
xmall

 

6.local_setting.py

setting.py
try
: from .local_settings import * except ImportError: pass
"""
Django settings for s25 project.

Generated by 'django-admin startproject' using Django 1.11.7.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '5cgwwp#mio9=kq@rfi!oi2h=b=wcd0_2p!qf33@)k%x4kdg!0*'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'web.apps.WebConfig'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'web.middleware.auth.AuthMiddleware'
]

ROOT_URLCONF = 's25.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 's25.wsgi.application'

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# datetime.datetime.now() / datetime.datetime.utcnow() => utc时间
# TIME_ZONE = 'UTC'

# datetime.datetime.now() - 东八区时间 / datetime.datetime.utcnow() => utc时间
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

# 影响自动生成数据库时间字段;
#       USE_TZ = True,创建UTC时间写入到数据库。
#       USE_TZ = False,根据TIME_ZONE设置的时区进行创建时间并写入数据库
USE_TZ = False

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

# ######## sms  ########

# 腾讯云短信应用的 app_id
TENCENT_SMS_APP_ID = 6666666666

# 腾讯云短信应用的 app_key
TENCENT_SMS_APP_KEY = "6666666666666666666666"

# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "Python之路"

TENCENT_SMS_TEMPLATE = {
    'register': 548760,
    'login': 548762
}

TENCENT_COS_ID = "COS的secret_id"
TENCENT_COS_KEY = "COS的secret_key"

# ########### 登录白名单:无需登录就可以访问的页面 ###########
WHITE_REGEX_URL_LIST = [
    "/register/",
    "/send/sms/",
    "/login/",
    "/login/sms/",
    "/image/code/",
    "/index/",
    "/price/",
]

# -----------支付宝alipay 相关配置-----------------
ALI_GATEWAY="https://openapi.alipaydev.com/gateway.do"
ALI_APPID='xxxxxxx'
ALI_PRI_KEY_PATH =os.path.join(BASE_DIR,'files/应用私钥2048.txt')
ALI_PUB_KEY_PATH=os.path.join(BASE_DIR,'files/支付宝公钥.txt')
ALI_NOTIFY_URL ="http://127.0.0.1:8000/pay/notify/"
ALI_RETURN_URL="http://127.0.0.1:8000/pay/notify/"

try:
    from .local_settings import *
except ImportError:
    pass
settings.py
#!\Users\Local\Programs\Python37
# -*- coding: utf-8 -*-

# ------------ 腾讯云(发短信 sms-cos存储桶)------------

# 腾讯云短信应用的 app_id
TENCENT_SMS_APP_ID = 1400489336

# 腾讯云短信应用的 app_key
TENCENT_SMS_APP_KEY = "290d09151f3338901b7ec118c4def2c9"

# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "华王的心得"

# 模板ID
TENCENT_SMS_TEMPLATE = {
    'register': 881346,
    'login': 881344,
    'resetpwd':881347,
}
# cos
TENCENT_COS_ID = 'AKIDThIepkCQQFqDMFtErFNbHL9PO5XhpCTg'  # 替换为用户的 secretId
TENCENT_COS_KEY = '5indDWejdKl00i9Jn2zf4qMahsgJvSjl'  # 替换为用户的 secretKey

# name = form.cleaned_data['name']
# # 1. 为项目创建一个桶
# bucket = "{}-{}-{}-1304998306".format(name, request.tracer.user.mobile_phone, str(int(time.time())))
# region = 'ap-nanjing'

# -----------django_redis配置-----------------

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379", # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            # "PASSWORD": "foobared" # redis密码
        }
    },
    "master": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://10.211.55.29:6379", # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            "PASSWORD": "foobar999ed" # redis密码
        }
    }
}
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# -----------支付宝alipay 相关配置-----------------
ALI_GATEWAY="https://openapi.alipaydev.com/gateway.do"
ALI_APPID='2021000117613231'
ALI_PRI_KEY_PATH =os.path.join(BASE_DIR,'files/应用私钥2048.txt')
ALI_PUB_KEY_PATH=os.path.join(BASE_DIR,'files/支付宝公钥.txt')
ALI_NOTIFY_URL ="http://127.0.0.1:8000/pay/notify/"
ALI_RETURN_URL="http://127.0.0.1:8000/pay/notify/"
local_settings.py

 

7.Django乱码

 1 解决中文乱码的问题

def query_valid(cls, request):
        task_id = request.GET.get('task_id')
        data =TcLabeled.objects.filter(task_id=task_id,user='valid').values('labels')
        data =list(data)
        print(data)
        response = dict()
        response.update({
            'res': True,
            'data': data
        })
        print(response)
        return JsonResponse(response,json_dumps_params={'ensure_ascii': False})

 

8 管理员身份运行(纯键盘模式)

纯键盘模式

点开开始,在开始的输入框中输入cmd,这个时候出现cmd的快捷方式,可以采用方法一的方法启用管理员调用,但这里我们不用鼠标,直接按住CTRL+SHIFT+ENTER三个键就可以直接调用管理员权限的cmd了;

 

9 Pyinstaller打包为exe文件 

icon链接:http://www.icosky.com/cat/file-type-icons/

自我生成icon:http://www.ico51.cn/

# 1 使用conda创建虚拟环境
conda create -n 虚拟环境名字 python=3.6  #创建虚拟环境
conda activate 虚拟环境名字  #激活虚拟环境
conda deactivate  #退出虚拟环境
conda remove -n aotu --all  # 删除虚拟环境
conda info --envs #查看虚拟环境
#
2 Pyinstaller打包
#安装Pyinstall和其他依赖的包
pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源
# 3 打包
Pyinstaller
-F -w -i apple.ico py_word.py #产生一个exe文件
Pyinstaller -F py_word.py #弹出命令行,方便调试 -w(是否弹出控制台)
#Pyinstaller -D -w -i chengzi.ico py_word.py #产生一个目录(备用,优点:启动快,打包快但文件过大)

 

 10 创建文件夹(os+datetime)

import datetime
import os

curr_time = datetime.datetime.now()
path = datetime.datetime.strftime(curr_time, '%Y%m%d%H%M')#
if os.path.exists(path): 
    print("属于这个时间点的文件夹已经创建好")
else:
    os.mkdir(path)
    print("创建成功!!!!正在保存图片")

dirname = os.getcwd() + '\\' + path + '\\' #获取当前工作目录并加上之前的时间生成文件夹路径

 

11 sshkey

1 生成公钥与私钥
ssh-keygen -t rsa -C "642178633@qq.com"
#win: C:\Users\huawang\.ssh
#linux: ~/.ssh/

2找到B服务器的 ~/.ssh/authorized_keys 将A的id_rsa.pub公钥内容复制进去
cd ~/.ssh/
vim a.txt #复制你的公钥
echo a.txt >> authorized_keys #追加公钥到此文件中

 

14 md5sum

MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改

#linux
md5sum main.cpp 

#windows
certutil -hashfile test12.py MD5

 

15 speedtest-cli

pip install speedtest-cli

speedtest-cli --secure
speedtest --secure

 

包工具

1 nvm(nodejs) -npm 

nvm
网站:https://nvm.uihtm.com/#nvm-linux

1下载
cd ~
wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz

2解压
mkdir   ~/.nvm
tar -zxvf nvm-0.39.0.tar.gz -C ~ /.nvm

3 环境配置
vim ~/.bashrc
export NVM_DIR="$HOME/.nvm/nvm-0.39.1"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

4生效
source ~/.bashrc

5安装与使用
nvm install 8.16.0
nvm list node
nvm use 14.17.3
nvm使用
参考网址:https://docs.npmjs.com/cli/v6/commands/npm-install

淘宝NPM 镜像 npm install
-g cnpm --registry=https://registry.npmmirror.com cnpm install [name]
npm install --registry=https://registry.npm.taobao.org #镜像安装
npm -v #版本 npm install express -g #全局安装 npm list -g #全局安装模块 npm config get prefix #查看全局安装包路径  npm search express #搜索模块 ;npm list --depth=0 #查看安装的包 var express = require('express');
npm init #初始化项目
npm install express #安装(把X包安装到node_modules目录中,但不会修改package.json,之后运行npm install, 不会自动安装X包)
npm uninstall express #卸载
npm install express --save # 等同于 -S (npm i --production 会自动安装)
npm i module_name
-save-dev #等同于 -D 开发环境下(生产环境不需要)
npm install #默认安装 dependencies 和devDependencies 中的所有模块

 

其他:

1 bat文件(批量修改文件后缀)

1新建的txt文档,
2输入ren  *.png  *.jpg,
解释下:Ren  空格  星号  点  需要修改的文件后缀名  空格  星号 点  需要改成的文件后缀名;
3 改为bat后缀

 

posted @ 2021-05-26 14:42  风hua  阅读(193)  评论(0编辑  收藏  举报