* 复习
* 防火墙
* 编译安装 nginx
* python环境 虚拟环境 安装 django
* scp 文件传输工具 磁盘管理
## 复习
```
sudo: unable to resolve host
解决方案 :
查看 hostname
vim /ets/hosts
127.0.0.1 你的hostname
```
### 给pycharm 创建快捷方式
```
1.sudo vim /usr/share/applications/pycharm.desktop
在里边写内容
[Desktop Entry]
Type=Application
Name=Pycharm
GenericName=Pycharm3
Comment=Pycharm3:The Python IDE
Exec="/home/python06/pycharm-2018.2.2/bin/pycharm.sh" %f
Icon=/home/python06/pycharm-2018.2.2/bin/pycharm.png
Terminal=pycharm
Categories=Pycharm;
保存
给 pycharm.desktop 增加执行的权限
sudo chmod +x /usr/share/applications/pycharm.desktop
cp /usr/share/applications/pycharm.desktop /home/python06/Desktop
```
## 防火墙
```
端口号 是可以修改的 自定义端口号 必须从 127 以后 最好是 1000以后 别人不好猜的
防火墙一定注意开放这个端口
sudo apt-get install ufw
sudo ufw enable
sudo ufw disable
sudo ufw status
如果刚刚开始防火墙 先设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
开启或者 禁用指定的链接
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 22
允许特定范围的端口号
sudo ufw allow 5000:6000/tcp 开放 5000-6000的端口号
sudo ufw deny from IP地址 拒绝该ip访问
sudo ufw allow 10.11.53.0/24 只允许 10.11.53.1~10.11.53.254 访问
删除规则
sudo ufw status numbered
sudo ufw delete 行号
```
## 编译安装 nginx
不用编译
```
sudo apt-get install nginx
```
1. 安装 所需的依赖包
```
sudo apt-get update
sudo apt-get install gcc automake autoconf libtool make build-essential libpcre3-dev
```
2. 通过winscp 把软件放到指定的目录
```
或者 wget -c http://nginx.org/download/nginx-1.8.1.tar.gz
列表:
pcre
openssl
zlib
nginx
```
3. 分别解压四个软件
```
sudo tar -zxvf nginx-1.9.9.tar.gz
sudo tar -zxvf pcre-8.42.tar.gz
sudo tar -zxvf zlib-1.2.11.tar.gz
sudo tar -zxvf openssl-1.0.2h.tar.gz
```
4. 进入 nginx-1.9.9
```
1. ./configure 进行配置
--prefix=路径 你想把软件安装在什么位置
--with-pcre 依赖于 pcre 模块
--enable 表示启用什么功能
--disable 禁用什么功能
2. 编译 sudo make
3. 安装 sudo make install
cd /home/need888/good/nginx-1.9.9
会发现有一个 configure
./configure
--prefix=/usr/local/nginx #指定安装在哪里
--pid-path=/usr/local/nginx/logs/nginx.pid #nginx 进程文件存在哪里
--error-log-path=/usr/local/nginx/logs/error.log #错误日志存在哪里
--http-log-path=/usr/local/nginx/logs/access.log # nginx 访问日志存在哪里
--with-http_ssl_module 启用 http安全访问模块
--with-pcre=/home/need888/good/pcre-8.42 # 依赖于pcre 模块
--with-zlib=/home/need888/good/zlib-1.2.11 #依赖于 zlib模块
--with-openssl=/home/need888/good/openssl-1.0.2h #依赖于 openssl 模块
sudo ./configure --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/logs/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-http_ssl_module --with-pcre=/home/need888/good/pcre-8.42 --with-zlib=/home/need888/good/zlib-1.2.11 --with-openssl=/home/need888/good/openssl-1.0.2h
编译过程中 出现 warning 不用管
直到出现 error
sudo make && sudo make install
```
想办法实现 service nginx start|stop|restart
sudo vim /etc/init.d/nginx 这个文件本身不存在 我们新创建 复制以下内容
```shell
#!/bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
# Include nginx defaults if available
if [ -r /etc/default/nginx ]; then
. /etc/default/nginx
fi
STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
test -x $DAEMON || exit 0
. /lib/init/vars.sh
. /lib/lsb/init-functions
# Try to extract nginx pidfile
PID=$(cat /usr/local/nginx/conf/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
if [ -z "$PID" ]; then
PID=/run/nginx.pid
fi
if [ -n "$ULIMIT" ]; then
# Set ulimit if it is set in /etc/default/nginx
ulimit $ULIMIT
fi
start_nginx() {
# Start the daemon/service
#
# Returns:
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
$DAEMON_OPTS 2>/dev/null \
|| return 2
}
test_config() {
# Test the nginx configuration
$DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
}
stop_nginx() {
# Stops the daemon/service
#
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
RETVAL="$?"
sleep 1
return "$RETVAL"
}
reload_nginx() {
# Function that sends a SIGHUP to the daemon/service
start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
return 0
}
rotate_logs() {
# Rotate log files
start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
return 0
}
upgrade_nginx() {
# Online upgrade nginx executable
# http://nginx.org/en/docs/control.html
#
# Return
# 0 if nginx has been successfully upgraded
# 1 if nginx is not running
# 2 if the pid files were not created on time
# 3 if the old master could not be killed
if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
# Wait for both old and new master to write their pid file
while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
cnt=`expr $cnt + 1`
if [ $cnt -gt 10 ]; then
return 2
fi
sleep 1
done
# Everything is ready, gracefully stop the old master
if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
return 0
else
return 3
fi
else
return 1
fi
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
start_nginx
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
stop_nginx
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"
# Check configuration before stopping nginx
if ! test_config; then
log_end_msg 1 # Configuration error
exit $?
fi
stop_nginx
case "$?" in
0|1)
start_nginx
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC configuration" "$NAME"
# Check configuration before stopping nginx
#
# This is not entirely correct since the on-disk nginx binary
# may differ from the in-memory one, but that's not common.
# We prefer to check the configuration and return an error
# to the administrator.
if ! test_config; then
log_end_msg 1 # Configuration error
exit $?
fi
reload_nginx
log_end_msg $?
;;
configtest|testconfig)
log_daemon_msg "Testing $DESC configuration"
test_config
log_end_msg $?
;;
status)
status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
;;
upgrade)
log_daemon_msg "Upgrading binary" "$NAME"
upgrade_nginx
log_end_msg $?
;;
rotate)
log_daemon_msg "Re-opening $DESC log files" "$NAME"
rotate_logs
log_end_msg $?
;;
*)
echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
exit 3
;;
esac
```
```shell
chmod +x /etc/init.d/nginx
注册服务
cd /etc/init.d/
sudo update-rc.d nginx defaults
接下来 大家就可以使用 service nginx start|stop|restart
```
## 文件同步
* ssh
* scp
* rsync
```
ssh 跟 scp 一样 走 22端口
ssh 用户名@ip地址
默认输入密码
推出 exit
```
| IP地址 | 角色 |
| ------------ | ---- |
| 10.11.53.66 | |
| 10.11.53.195 | |
1.先到 66上 进行操作
```
root@python06-virtual-machine:~/.ssh# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_ssh_rsa
#默认/root/.ssh/id_rsa 为了防止覆盖前面的 最好新起名字 英文状态下输入
Enter passphrase (empty for no passphrase): 回车
Enter same passphrase again: 回车
Your identification has been saved in /root/.ssh/id_ssh_rsa.
Your public key has been saved in /root/.ssh/id_ssh_rsa.pub.
The key fingerprint is:
SHA256:qOivnhwxYU0XIacCEmHs/H7Je/Qw2H/JpL//iaWfem8 root@python06-virtual-machine
The key's randomart image is:
su root
cd /root/.ssh
会发现id_ssh_rsa id_ssh_rsa.pub 密钥对
cat id_ssh_rsa.pub 复制内容
```
2.到195上进行操作
```
su root
mkdir -p /root/.ssh
cd /root/.ssh/
vim authorized_keys
粘贴过来刚才的内容
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh
```
3. 到 66上 测试
```
ssh 195用户名@195ip地址
```
### scp 两台linux 主机之间 进行文件复制
```
scp 文件 远程用户名@ip地址:路径 把本地复制到远程 上传
比如scp 1.txt [email protected]:/home/tuizz
scp -r [email protected]:/home/tuizz/test /home/python06 把远程的复制到本地 下载
cp -r 复制目录的意思
```
### rsync
```shell
-a 以递归的方式传输文件
-v 打印传输速率文件数量
--delete 为了保证 两个文件夹内容一样 ab 先把b文件夹中 a没有的内容删除 然后 把a的内容复制过来
--exclude 排除掉 指定的文件
--progress 显示传输过程
-p 保持文件的权限
-l 保持软连接
-o保持所属用户
-g 保持所属的组
-t 保持文件的修改时间
-u 如果说目标文件 更新 那么该文件就被忽略
本地同步
rsync -av one/ two/ 将one目录下面的文件 复制到 two目录下
rsync -av one two 将这个one目录复制到 two 目录下面
rsync -av --exclude=*.tar.* one/ two/ 将one目录下面的 内容复制到two 目录下 排除掉*.tar.*
rsync -av --exclude=public/* --progress one/ two/ 只复制one 目录下的public 文件夹 里边的内容被忽略掉
rsync -avtogl --delete one/ two/
先把two目录中 跟one目录不同的内容删除掉 然后再复制
rsync -auv one/ two/
如果one目录下面的内容 不如two目录下面的新 谁最后改的就是新的
主机之间 同步
rsync -auv --delete --progress --exclude=public/* one/ [email protected]:/home/python06/test
这个冒号别忘了
crontab -e -u need888
30 3 * * * /usr/bin/rsync -auvplog --delete --progress --exclude=public/* one/ [email protected]:/home/python06/test
每天的凌晨三点半 执行 数据同步
```
## python开发环境配置
#### pyenv
> 是一个全局的python版本管理工具 能够进行 全局的python版本切换 使用pyenv 之后 可以再 服务器上安装多个python版本
#### 安装 pyenv https://github.com/pyenv/pyenv-installer
```
安装 git
sudo apt-get install git curl
sudo rm -rf ~/.pyenv
1.curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
会在 /home/need888/ 有一个 .pyenv的隐藏文件夹
2.修改 vim ~/.bashrc
最后一行 写入
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
3.source ~/.bashrc #让配置文件立即生效的意思
4. pyenv update 更新pyenv 看到 Already up-to-date. 说明更新完成
```
### 使用pyenv
```
pyenv install --list # 查看 pyenv 支持 哪些python版本
pyenv versions #查看 pyenv 可以管理哪些python版本
在安装 pyenv 之前 系统已经默认安装了 2.7 和3.5 这个时候 pyenv 它没有权利去管理这两个版本
解决方案 先卸载掉系统自带的python 版本
用pyenv 安装python
```
### 使用pyenv 安装 python 不会跟系统安装的 python 起冲突
```
1.安装依赖包
sudo apt-get install gcc libc6-dev make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm
2.下载python Python-2.7.9.tar.xz 和 Python-3.6.4.tar.xz 软件包
3.cd ~/.pyenv
mkdir cache
将上面两个软件包 放到 cache目录下
4. pyenv install 2.7.9 -v v表示显示安装过程
pyenv install 3.6.4 -v
5.设置默认版本
pyenv global 2.7.9
python 测试以下 看看版本是否是 3.6.4
pyenv global 3.6.4
6.pyenv versions
python06@python06-virtual-machine:~/.pyenv/versions$ pyenv versions
system
2.7.9
* 3.6.4 (set by /home/python06/.pyenv/version) * 在哪 表示 当前默认版本是 谁
7.pyenv rehash #更新 pyenv的数据库
```
#### virtualenv
> 京东 主站 python2.0 django 1.0 京东金融 python2.0 django 2.0 想办法让这两个 共存
>
> 这个时候 可以 pyenv + virtualenv 结合来用
#### 安装 virtualenv
pip 是python自带的包管理工具 类似于360的软件管家
```
pip install virtualenv
如果提示版本不匹配 这个时候 可以使用
sudo pip install --upgrade virtualenv
创建项目目录
sudo mkdir -p /home/python06/myproject/jd
cd /home/python06/myproject/jd
pyenv virtualenv 3.6.4 env36 #创建python3.6.4 版本的虚拟环境
pyenv virtualenv 3.6.4 env88 #同样创建一个3.6.4 版本的虚拟环境
pyenv virtualenv 2.7.9 env27 ##创建python2.7.9 版本的虚拟环境
pyenv activate env36 #进入虚拟环境 env36 想使用django1.0 进入这个虚拟环境
pyenv deactivate env36
pyenv activate env88 #进入虚拟环境 env88 想使用django2.0 进入这个虚拟环境
pyenv deactivate env88
pyenv activate env27 #进入虚拟环境 env27
pyenv deactivate env27
```
#### psm
> pip 是python自带的包管理工具 默认 pip是到 官网去下载 但是 问题很慢
>
> 解决办法是 pip 到国内应用商店下载
##### 安装 psm
```
pip install psm
pip install --upgrade pip
psm ls #列出国内可以使用的软件商店
pypi https://pypi.python.org/simple/
douban http://pypi.douban.com/simple/
aliyun http://mirrors.aliyun.com/pypi/simple/
psm use douban #选择豆瓣 源
psm show #查看当前应用哪个源
Current source is douban
```