Linux部署web服务器

步骤

  1. 安装linux系统
  2. 安装基础工具包(根据官网)
  3. 在root账户下 安装python解释器
  4. 创建专属权限账户,根据需要对账户进行提权,创建虚拟环境
  5. 上传项目文件,根据requirements文件,安装环境依赖包
  6. 安装redis数据库
  7. 安装nginx服务器,调试静态文件访问
  8. 安装uwsgi,接管flask与nginx间的动态文件访问

实施代码

安装linux

选择centOS系统安装 最新版本

安装基础工具包

设置镜像源

#1.备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#2.设置镜像源
#2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#3、之后运行yum makecache生成缓存
yum makecache

安装基础工具包

# 安装 gcc c的解释器 (只需要装一次 如果已安装,则跳过安装) 
yum -y install gcc
# 安装多个库  
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel libffi-devel  wget curl-devel

源码安装python解释器

1. 下载软件
    #下载软件   wget url地址  (地址在  官网/ftp/  找对应版本的源码文件)
    wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
    #解压
    tar -xvf Python-3.6.5.tgz
2.安装python
	#打开解压文件 
	#配置 --prefix 设置程序安装路径 
	#./configure [--enable-optimizations] --prefix=路径  []内,命令执行时间很长,但可以提升效率
	$ ./configure --prefix=/usr/local/python3 --enable-optimizations
	# 编译和安装
	$ make & make install
3.配置环境变量
    # 进入编辑 profile
    vim /etc/profile
    # 添加成环境变量(所有用户都有效)
    #export PATH=路径:$PATH
    export PATH=/usr/local/python3/bin:$PATH
    # 让环境变量生效
    source /etc/profile
4. 修改pip镜像源
	在家目录下创建一个.pip目录,然后在这个目录下创建pip.conf文件
	内容:
	[global]
	index-url=http://mirrors.aliyun.com/pypi/simple/
	[install]
	trusted-host=mirrors.aliyun.com
5. 安装virtualenv
    #在线安装virtualenv   linux中必须用 pip3
    #升级pip
    pip3 install --upgrade pip
    #安装virtualenv
    pip3 install virtualenv

创建专属权限用户

创建用户

#在root用户下运行命令 创建web用户(其用户组名与用户名同名)
adduser webapp
#设置web账户密码
passwd webapp

用户提权

设置web用户的权限配置文件(root账户配置文件)
	# 在/etc/sudoers.d/里新建一个权限申请单,名字建议使用同名的用户名
	$ vim /etc/sudoers.d/用户名
	内容:
	用户名    ALL=(ALL)       ALL
普通用户提权,
通过sudo命令,得到系统的root权限(需要输入普通用户密码)

切换用户

su webapp			: 切换到普通用户webapp权限
su -				: 切换到root用户
#在普通用户下使用命令
sudo 命令     相当于运行root权限命令

创建环境

创建虚拟环境

webapp用户提权操作,生成虚拟环境
#sudo virtualenv -p 源路径 目标路径(最安全的方式为绝对路径)
sudo virtualenv -p python3 ./
#打开虚拟环境
source activate

上传项目文件

#可以通过pycharm集成工具sftp远程上传
也可以在操作窗口拖拽完成
注意上传时的用的谁的权限

安装项目运行需要的第三方库

#首先在开发环境中镜像第三方安装包目录
pip freeze > requirements.txt
#打开虚拟环境
source activate
#在虚拟环境中安装工具
pip3 install -r requirements.txt

安装redis数据库

/usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32。
/usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。
/opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。

源码放哪里?

/usr/src:系统级的源码目录。

/usr/local/src:用户级的源码目录。

在root权限下
# 下载redis源码,目前下载4.0版本
$ wget http://download.redis.io/releases/redis-4.0.11.tar.gz
# 解压
$ tar -zxvf redis-4.0.11.tar.gz
#打开解压文件 编译redis
make
#安装到本地文件夹,
make install

#将配置文件拷贝到/etc/
cp redis.conf /etc/
#修改/etc/下的配置文件redis.conf  将redis设置为守护进程
daemonize yes
#开启redis服务
redis-server /etc/redis.conf

测试项目代码能否正常运行

注意配置 ip 和 端口

以及开通远程服务器的端口访问权限

在服务器上 配置安全组

安装nginx服务器

nginx服务器要点:1. 是多进程方式工作 2. master进程主要是来管理worker进程,负载均衡管理

  1. 安装
#在root权限下,yum安装nginx
yum install nginx
测试
$ nginx -t
启动:
$ nginx
关闭/重启
$ nginx -s stop/reload
  1. 修改配置文件
    其配置文件在 /etc/nginx/nginx.conf
# user指定了nginx的worker进程以什么用户和组权限运行,必须改为你开发的用户和所属组

user whn webapps;			# 需要修改

# worker_processes代表工人进程的数量,建议和CPU核心数一致
worker_processes auto;
# 全局错误日志文件
error_log /var/log/nginx/error.log;
# master进程的进程号存放的位置
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
# ★ 不建议修改这里的include文件,他是代表全局; ★
# ★ 建议修改http空间里的include来包含个人业务网站的配置信息. ★
events {
	# 每个工人进程的连接最大数
    worker_connections 1024;
    
    # 使用什么模型进行IO复用
    use epoll;  #需要添加
    
}
http {
	# 日志打印格式
    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  /var/log/nginx/access.log  main;
	# 打开内核文件传输的开关
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
	# 包含content-type的取值依据文件
    include             /etc/nginx/mime.types;
    # 若传输文件后缀名无效时,默认content-type的取值
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    # ★ 系统默认的子配置存储的位置,建议屏蔽后,包含自己工程目录下的文件 ★
    include /etc/nginx/conf.d/*.conf;
    
    # ★ 配置自己工程项目的nginx配置文件 ★
    #include /webapps/whn/elm_webapps/conf.d/*.conf;
    include /home/webapp/eleme/nginx.conf;

nginx后台配置文件参考:

将原有server配置注释,配置自己的server,并更改http中自己的nginx配置文件路径
   server {
   	# listen代表监听端口
       listen   80;
       # server_name代表虚拟服务器的域名
       server_name www.gmjone.cn;
   	#静态路由设置
   	# location代表一条匹配规则,当规则满足时,指定括号里的映射关系
       location /static/ {
       	# 使用alias做虚拟url和物理目录的映射关系.
           alias    /home/webapp/eleme/apps/static/;
       }
   	#设置动态路由
       location / {
       	# 加载nginx提供的uwsgi模块
           include uwsgi_params;
           # 利用uwsgi_pass访问本地socket的5050端口,进行进程间通信,
           uwsgi_pass 127.0.0.1:5050; #端口号要与uwsgi中配置的端口号一致
       }
   }

api接口配置文件参考:

server {
   	# listen代表监听端口
       listen   80;
       # server_name代表虚拟服务器的域名
       server_name _;
   	#静态路由设置
   	# location代表一条匹配规则,当规则满足时,指定括号里的映射关系
       location / {
       	# 使用alias做虚拟url和物理目录的映射关系.
           alias    /home/webapp/eleme/apps/client/;
           index index.html
       }
   		#设置动态路由
       location /api/ {
       	# 加载nginx提供的uwsgi模块
           include uwsgi_params;
           # 利用uwsgi_pass访问本地socket的5050端口,进行进程间通信,
           uwsgi_pass 127.0.0.1:5051; #端口号要与uwsgi中配置的端口号一致
       }
   }

测试静态文件访问

安装uwsgi服务器

#安装
$ pip install uwsgi

配置uwsgi

建议将uwsgi的配置信息保存在文件进行维护,方便管理.在开发环境项目文件中增加一个uwsgi.ini目录,将目录内容同步到生产环境中.

/home/webapp/eleme/uwsgi.ini

uwsgi都运行在127.0.0.1内部端口,由nginx的反向代理来把数据交付过来.

参考配置:

后台服务器配置:

[uwsgi]
# 所有的配置文件的路径必须为绝对路径

# uwsgi服务开放的socket接口的信息
socket = 127.0.0.1:5050
# wsgi规范的模块的路径信息
wsgi-file = /home/webapp/eleme/manager.py
# application的对象名
callable = app

# 运行时,先进入到哪个工程目录
chdir = /home/webapp/eleme/

# 虚拟环境的路径
virtualenv = /home/webapp/env/vflask/

processes = 1
threads = 1
master = true
# 守护进行的日志文件路径   访问没有问题,最后改为守护进程
#daemonize = /home/webapp/eleme/logs/cms.log

客户端配置参考:

[uwsgi]
   # 所有的配置文件的路径必须为绝对路径
   
   # uwsgi服务开放的socket接口的信息
   socket = 127.0.0.1:5051
   # wsgi规范的模块的路径信息
   wsgi-file = /home/webapp/eleme/app_api.py
   # application的对象名
   callable = app
   
   # 运行时,先进入到哪个工程目录
   chdir = /home/webapp/eleme/
   
   # 虚拟环境的路径
   virtualenv = /home/webapp/env/vflask/
   
   processes = 1
   threads = 1
   master = true
   # 守护进行的日志文件路径   访问没有问题,最后改为守护进程
   #daemonize = /home/webapp/eleme/logs/api.log

开启uwsgi,用于测试

#在虚拟环境中测试  
 uwsgi --http 地址:端口 --wsgi-file 入口文件 --callable 回调函数
 uwsgi --http :9904 --wsgi-file manager.py --callable app
 
 #添加日志文件夹
 
#运行uwsgi   后面为配置文件
uwsgi /home/webapp/eleme/uwsgi.ini
uwsgi /home/webapp/eleme/uwsgi_api.ini

常用命令

netstat -tuanp   查看tcp udp 进程
ps -aux | grep nginx   查看nginx的进程