python技术--Linux基础04

* 复习  
* 防火墙   
* 编译安装 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

```

猜你喜欢

转载自blog.csdn.net/qq_42336700/article/details/82390462
今日推荐