和window差不多的操作系统 :大部分开源免费
Redhat工具 + GNU工具 + 文件 + Linux内核 + 库文件 = 完整的操作系统 Redhat
CentOS 基于红帽演变
Ubuntu 开发 / 服务器
Centos
Ubuntu 有可视化界面
shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。
shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。
[root@oldboy-pythonedu ~]#
root: 表示当前登录Bash Shell窗口的用户是..
oldboy-python: 当前系统的主机名称
~: 当前用户所处的路径 ~ 表示的是当前用户的家目录
#: 提示符 # 表示超级管理员
$ 表示普通用户
命令 选项 参数
ls -l /tmp
ctrl + a : 命令光标跳到行首
ctrl + e : 命令光标跳到行尾
ctrl + l : 清屏
ctrl + c :中断bash窗口 前台正在运行的程序
ctrl + u : 删除光标之前的
ctrl + k : 删除光标之后的
ctrl + w : 按照单词跳转光标
ctrl + <--> : 按照单词跳转光标
目录结构:
linux根目录下的文件作用
创建文件 touch
#在家目录创建一个hello.py文件
touch /home/hello.py
复制文件或目录 cp
#在/home下创建一个hello.py文件
cp /home/hello.py /tmp/ #直接拷贝
cp /home/hello.py /tmp/test.py #拷贝后修改名称
删除文件 rm
查看文件内容 cat
创建目录 mkdir
移动文件或目录
查照一个命令的绝对路径
文件的下载和上传 *(yum install wget -y)
文件的压缩和解压
能正常登录操作系统的的账号就是用户
用户的分类
用户的查询
创建用户
创建用户的存储信息地址查询
cat /etc/passwd
root ❌0:0:root:/root:/bin/bash
oldboy❌1001:1001::/home/oldboy:/bin/bash
#以冒号分割七列
第一列: 用户名称
第二列: 密码占位符,密码存储在 /etc/shadow 文件中
第三列: 用户的UID
第四列: 用户的GID
第五列: 描述信息 commit
第六列: 用户的家目录
第七列: 用户登录的Bash类型
用户存储密码的文件
创建用户的参数
#1.创建oldboyedu用户,UID5001,基本组students,附加组sa 注释信息:2020 new student,登陆shell:/bin/bash
[root@oldboy-pythonedu ~]# groupadd students
[root@oldboy-pythonedu ~]# groupadd sa
[root@oldboy-pythonedu ~]# useradd oldboyedu -u 5001 -g students -G sa -c "2020 new student" -s /bin/bash
#2.创建mysql系统用户,-M不建立用户家目录 -s指定nologin使其用户无法登陆系统
[root@oldboy-pythonedu ~]# useradd mysql -r -M -s /sbin/nologin
#3.删除用户
userdel -r username 删除用户,并删除用户的家目录,不建议加-r: 因为很多情况下开发使用的用户家目录下有很多软件和配置文件
仅root可以设定所有人的密码, 普通仅能设定自己的密码,并且密码的强度有要求.
交互式: passwd [username]
非交互式: echo “12” | passwd --stdin root 固定密码
echo $RANDOM | md5sum | cut -c 2-10 | tee 1.txt |passwd --stdin root #随机密码
用户组:
所属组:当创建一个用户时,如果不指定主组,会默认创建一个同名的组.
附加组:创建用户时可以指定我想加入的附加组,此时用户就可以具备附加的组的权限
创建组:
[root@oldboy-pythonedu ~]# groupadd -g 5001 devops
删除组:
[root@oldboy-pythonedu ~]# groupdel devops
[root@oldboy-pythonedu ~]# groupdel students
groupdel:不能移除用户“oldboyedu”的主组
[root@oldboy-pythonedu ~]# userdel -r oldboyedu [root@oldboy-pythonedu ~]# groupdel students
su切换身份
sudo 提权
快速给用户分配一个sudo的权限:
[root@oldboy-pythonedu ~]# useradd -G wheel oldxu
[root@oldboy-pythonedu ~]# echo "123" | passwd --stdin oldxu
验证权限:
[oldxu@oldboy-pythonedu ~]$ yum install wget -y
已加载插件:fastestmirror
您需要 root 权限执行此命令。
[oldxu@oldboy-pythonedu ~]$ sudo yum install wget -y
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] oldxu 的密码: # 普通自己的密码,不是root的密码
vim /etc/sudoers
visudo -c 检查语法
1.定义组名称 ( sudo里面的虚拟的 )
User_Alias DEV = kaifa1,kaifa2
User_Alias OPS = ops1,ops2
2.定义权限
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Processes
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
2.将用户组与权限进行绑定
root ALL=(ALL) NOPASSWD:ALL #可以执行所有的命令,并且无需输入密码
DEV ALL=(ALL) NETWORKING,SOFTWARE,SERVICES
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,PROCESSES,STORAGE
3.创建对应的用户,并设定密码
[root@oldboy-pythonedu ~]# useradd kaifa1
[root@oldboy-pythonedu ~]# useradd kaifa2
[root@oldboy-pythonedu ~]# useradd ops1
[root@oldboy-pythonedu ~]# useradd ops2
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin kaifa1
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin kaifa2
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin ops1
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin ops2
4.使用 sudo -l 验证开发的权限和运维的权限是否不一致
用户 kaifa1 可以在 oldboy-pythonedu 上运行以下命令:
(ALL) /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/rpm,
/usr/bin/up2date, /usr/bin/yum, /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start,
/usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart,
/usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
用户 ops1 可以在 oldboy-pythonedu 上运行以下命令:
(ALL) /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/rpm,
/usr/bin/up2date, /usr/bin/yum, /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start,
/usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart,
/usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable,
/bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /sbin/fdisk, /sbin/sfdisk,
/sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
提取ip地址
1.提取IP地址 grep \ sed \ awk
[root@oldboy-pythonedu ~]# ifconfig ens32 | grep "inet " | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | head -1
10.0.0.200
[root@oldboy-pythonedu ~]# ifconfig ens32 | sed -n '2p' | sed -r 's#(^.*inet) (.*) (net.*$)#\2#g'
10.0.0.200
[root@oldboy-pythonedu ~]# ifconfig ens32 | awk 'NR==2 {print $2}'
10.0.0.200
2.提取/etc/passwd 用户名称, uid ,登录bash
[root@oldboy-pythonedu ~]# #awk -F ":" '{print $1,$3,$7}' /etc/passwd
3.统计分析访问中来源做多前10的IP地址 sort uniq awk
1.来源的IP地址在第几列
2.对数据进行排序
3.对数据进行去重,统计
4.取出前top10的IP地址
[root@oldboy-pythonedu ~]# awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10 > access_top10.txt
31577 116.211.216.152
25142 222.186.49.194
20841 120.27.74.166
9304 39.105.242.163
8277 61.147.73.164
7805 222.186.49.165
7559 123.156.198.164
7233 61.160.206.107
6596 220.170.48.75
6200 61.147.73.171
[root@oldboy-pythonedu ~]# time awk '{ ip[$1]++ } END { for ( i in ip ) print ip[i],i}' access.log | sort -nr | head -10
{
ip[$1]++
}
END{
for ( i in ip) {
print i,ip[i]
}
}
权限管理:主要用来约束用户能对系统所作的操作
权限与用户的关系
[root@oldboy-pythonedu ~]# ll useradd_2.sh
-rw-r-----. 1 adm root 618 9月 28 11:27 useradd_2.sh
字母 含义 对应权限
r(read) 读取权限 4
w(write) 写入权限 2
x(execute) 执行权限 1
-(没有权限) 没有权限 0
修改权限(进程运行需要一个用户, 而进程在完成上传的操作时, 需要调用对应的用户来执行, 能不能执行成功, 取决于该用户对该文件是否有权限)
#方法一
[root@oldboy-pythonedu ~]# chmod 640 useradd_2.sh
# 属主: rwx 读写执行 7
# 属组: r-x 读和执行 5
# 其他: r-x 读和执行 5
[root@oldboy-pythonedu ~]# chmod 755 useradd_2.sh [root@oldboy-pythonedu ~]# ll useradd_2.sh
-rwxr-xr-x. 1 adm root 618 9月 28 11:27 useradd_2.sh
#变更一个文件属主和属组
[root@oldboy-pythonedu ~]# chown -R www.www web-demo/
#方法二变更写入目录的属主和属组 ( 不要修改为 777 )
3.1) 检查进程运行的用户身份是什么: apache
[root@oldboy-pythonedu ~]# ps -ef |grep httpd | head -2
root 24130 1 0 10:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND #Master进程
apache 24132 24130 0 10:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND #Worker进程
3.2) 检查进程要写入的目录是什么权限:
[root@oldboy-pythonedu ~]# ll -d /var/www/html/
drwxr-xr-x. 2 root root 77 9月 29 10:21 /var/www/html/
总结: 写不进去的原因:
进程会调用apache用户往 /var/www/html目录写, 而apache用户对/var/www/html目录仅拥有 读和执行,所以会失败.
.3) 调整/var/www/html 属主和属组
[root@oldboy-pythonedu ~]# chown apache.apache /var/www/html/
[root@oldboy-pythonedu ~]# ll -d /var/www/html/
drwxr-xr-x. 2 apache apache 77 9月 29 10:21 /var/www/html/
3.4) 最后验证程序是否能正常上传文件至/var/www/html/中
[root@oldboy-pythonedu ~]# ll /var/www/html/2020-09-29/ -d
drwxr-xr-x. 2 apache apache 25 9月 29 10:27 /var/www/html/2020-09-29/
[root@oldboy-pythonedu ~]# ll /var/www/html/2020-09-29/
-rw-r--r--. 1 apache apache 438 9月 29 10:27 2_oldxu.txt
rpm:redhat package mananger 红帽管理工具,xxx.rpm 主要用来安装软件包 可以通过rpm 和yum工具管理 使用二进制包解压
rpm工具安装会牵扯到依赖关系:
A包 -> B包 -> C包
安装
[root@oldboy-pythonedu ~]# rpm -ivh https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/vsftpd-3.0.2-27.el7.x86_64.rpm
卸载
[root@oldboy-pythonedu ~]# rpm -e vsftpd
更新
[root@oldboy-pythonedu ~]# rpm -ivh https://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/3.0/x86_64/RPMS/mongodb-org-shell-3.0.0-1.el7.x86_64.rpm
查询结果
[root@oldboy-pythonedu ~]# rpm -qa | grep mongodb
mongodb-org-shell-3.0.0-1.el7.x86_64
查询命令
[root@oldboy-pythonedu ~]# rpm -q httpd #查询安装或者没有安装
[root@oldboy-pythonedu ~]# rpm -qa #显示系统中所有已安装的软件包
[root@oldboy-pythonedu ~]# rpm -qa | grep httpd #查询所有系统已安装的软件包,过滤指定的包名
[root@oldboy-pythonedu ~]# rpm -qc httpd #仅查看httpd这个包的配置在哪里
[root@oldboy-pythonedu ~]# rpm -ql httpd #查看httpd这个包所有的文件存储的路径
yum工具(联网) rpm包管理工具,主要用安装软件, 通过互联网安装软件. 并能解决依赖间关系.
源和仓库
配置源|仓库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
使用
#安装
[root@oldboy-pythonedu ~]# yum install samba -y
#更新
[root@oldboy-pythonedu ~]# yum update samba -y
#卸载
[root@oldboy-pythonedu ~]# yum remove samba -y
#查询 知道命令,但是不知道安装哪个软件包,
[root@oldboy-pythonedu ~]# yum provides ifconfig
[root@oldboy-pythonedu ~]# yum provides /etc/my.cnf
#清理缓存
[root@oldboy-pythonedu ~]# yum clean all # 清理所有的
[root@oldboy-pythonedu ~]# yum makecache #生成缓存
[root@oldboy-pythonedu ~]# yum repolist #查看仓库中的软件包
命令模式
复制: yy
粘贴: p
撤销: u
删除: dd | D 删除光标后的所有内容
剪切: 删除 + 粘贴
光标操作
编辑模式:
I:直接进入编辑模式
o: 插入新的行,并且进入编辑模式
A:光标移动到行尾,并进入编辑模式
a:光标向后移动一位,并进入编辑模式
快速切换到你想要的行
vim file.py + Number
200gg , :200
末行模式
保存: w
退出: q
不知道修改在哪不保存退出: !q
保存&退出:wq
收索: /search n 向下查照 N 向上查找
替换
:%s#over#OOVER#g 替换整个文件中over为 OOVER
1,5s#over##OOVER#g
视图模式
其他操作
linux一切皆为文件:
后缀:便于快速区分文件类型:
file:命令判断文件具体的文件类型
ll -h 人性化显示文件的大小
-rw-r–r--. 1 root root 32 9月 27 11:46 test.py
-rw-r--r--. # ①: 第一个标识文件类型, 后面九个标识文件的权限
1 # ②: 硬链接的次数
root # ③: 文件属于哪个用户
root # ④: 文件属于哪个组
32 # ⑤: 大小
9月 27 11:46 # ⑥: 文件最后的修改时间 [ 创建时间,访问时间,修改时间 ] stat test.txt
test.py # ⑦: 文件名称
nginx 是一个web服务器(静态资源)代理服务器
[root@oldboy-pythonedu ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #换源
[root@oldboy-pythonedu ~]# yum install nginx -y
[root@oldboy-pythonedu ~]# rpm -q nginx #查看安装版本
nginx-1.16.1-1.el7.x86_64
[root@oldboy-pythonedu ~]# rpm -ql nginx
/etc/logrotate.d/nginx # 日志轮转 ( 日志切割 )
/etc/nginx/ # nginx配置文件目录
/etc/nginx/nginx.conf # nginx主配置文件
/var/log/nginx # 日志目录
[root@oldboy-pythonedu ~]# systemctl stop httpd # 终止http进程
[root@oldboy-pythonedu ~]# systemctl disable httpd #防止http自己启动
[root@oldboy-pythonedu ~]# systemctl start nginx #重置nginx
[root@oldboy-pythonedu ~]# netstat -lntp | grep 80 #配置nginx端口 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26551/nginx: master
[root@oldboy-pythonedu ~]# cat /etc/nginx/nginx.conf
user nginx; # 运行nginx的用户身份
worker_processes auto; # worker进程运行多少个, auto自动与cpu核心保持一致
error_log /var/log/nginx/error.log; # 错误日志
pid /run/nginx.pid; # 进程运行后,在该目录下存放一个pid文件,文件中记录的是该进程的ID编号
include /usr/share/nginx/modules/*.conf; # 包含所有的模块配置文件
events {
worker_connections 1024; # worker的最大连接数 [ worker_connections * worker_processes ]
}
http { # 负责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;
include /etc/nginx/mime.types; # 存放的都是nginx能支持的文件类型
default_type application/octet-stream; # 当 nginx 不支持该类型时,默认以下载的方式回传给用户
include /etc/nginx/conf.d/*.conf; # 包含conf.d/*.conf结尾的文件
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#创建文件 mkdir /etc/nginx/conf.d/test.oldboyedu.com.conf
#写入内容
server {
listen 80;
server_name test.oldboyedu.com;
location / {
root /code/html;
index index.html;
}
}
[root@oldboy-pythonedu ~]# mkdir /code/html -p
[root@oldboy-pythonedu ~]# echo "test-oldboyedu.com....." > /code/html/index.html
[root@oldboy-pythonedu ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy-pythonedu ~]# systemctl restart nginx
配置Hosts解析(假域名)
nginx.conf 主要配置文件 ( 一般不动 )
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
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;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
#第一步: 编辑 nginx 配置文件
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/game.oldboyedu.com.conf
server {
listen 80;
server_name game.oldboyedu.com;
location / {
root /code/game;
index index.html;
}
}
#第二步: 根据配置,创建目录,上传代码
[root@oldboy-pythonedu ~]# mkdir /code/game -p
[root@oldboy-pythonedu ~]# cd /code/game/
[root@oldboy-pythonedu game]# rz
[root@oldboy-pythonedu game]# unzip html5_\(1\).zip
#第三步: 检查nginx配置文件语法, 然后重载服务
[root@oldboy-pythonedu game]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy-pythonedu game]# systemctl restart nginx
#第四步: 配置Hosts解析 ( 假的 )
Windows电脑没有Hosts文件, 新建出来.
Windows: C:\Windows\System32\drivers\etc\Hosts
10.0.0.200 test.oldboyedu.com
10.0.0.200 game.oldboyedu.com
# vim /etc/nginx/conf.d/game.oldboyedu.com.conf # 定义的第一个网站
server {
listen 80; # 监听的端口
server_name game.oldboyedu.com; # 申明域名
location / { # 匹配用户请求的uri路径
root /code/html; # 告诉 nginx 站点的代码在哪里目录下
index index.html index.htm; # 定义 默认返回的主页面
}
}
#Nginx整个请求流程
url路径: http://game.oldboyedu.com /game/zuqiu/index.html
真实服务器地址: /code/game/game/zuqiu/index.html
1.用户通过浏览器请求game.oldboyedu.com
2.浏览器会添加一些协议头信息,携带上默认的请求uri, http://game.oldboyedu.com/
3.浏览器会发起DNS解析,解析game.oldboyedu.com 对应的真实IP地址
4.浏览器获取到真实的IP地址后, 通过 IP+Prot的方式请求应用程序Nginx
5.Nginx接受到请求后,会进行事件的处理, 将用户请求的 Request 信息中 包含的 Host 字段, 与 Server_name 字段进行匹配
5.1) 如果匹配不成功,则会随机返回一个站点的页面给用户.
5.2) 可以通过 在 listen 80 default_server; 方式来定义具体默认返回哪个站点给用户.
5.3) 如果碰到非法的域名,可以拒绝,也可以做跳转.
拒绝:
return 500;
跳转:
return 302 https://www.jd.com;
6.如果匹配成功, 接下来进行location uri地址匹配, 获取要返回的文件所在的路径 + 默认返回的页面
7.Nginx获取磁盘上的文件, 然后构建响应报文,回传给浏览器,浏览器加载并且渲染最终的结果呈现给用户.
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/mirror.oldboyedu.com.conf
server {
listen 80;
server_name mirror.oldboyedu.com;
charset utf8;
location / {
root /code/mirror;
autoindex on; # 开启目录索引功能
autoindex_exact_size off; # 显示文件具体大小
autoindex_localtime on; # 显示本地服务器时间
}
}
[root@oldboy-pythonedu ~]# nginx -t
[root@oldboy-pythonedu ~]# systemctl restart nginx
[root@oldboy-pythonedu ~]# mkdir -p /code/mirror
[root@oldboy-pythonedu ~]# cd /code/mirror
[root@oldboy-pythonedu ~]# rz
基于来源IP限制
1) 仅允许 10.0.0.1 访问,其他访问全部拒绝
server {
...
allow 10.0.0.1/32;
deny all;
...
}
2) 拒绝10.0.0.1 访问, 其他全部允许
server {
...
deny 10.0.0.1/32;
allow all;
...
}
测试的curl命令:
[root@oldboy-pythonedu mirror]# curl -HHost:mirror.oldboyedu.com http://10.0.0.200/
基于用户与密码 auth_basic_module
[root@oldboy-pythonedu ~]# yum install httpd-tools -y
[root@oldboy-pythonedu nginx]# htpasswd -c -b password_file oldboy 123
[root@oldboy-pythonedu nginx]# cat password_file
oldboy:$apr1$7dYbXvco$LSJaBM3HqlK3k1kkRt2Ya.
nginx配置文件:
server {
listen 80;
server_name mirror.oldboyedu.com;
charset utf8;
auth_basic "hello,nginx"; # 描述信息
auth_basic_user_file password_file; # 定义密码文件名称
location / {
root /code/mirror;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
展示: /work 需要密码 /public 无需密码
[root@oldboy-pythonedu ~]# mkdir /basic/{work,public} -p
[root@oldboy-pythonedu mirror]# cat /etc/nginx/conf.d/basic.oldboyedu.com.conf
server {
listen 80;
server_name basic.oldboyedu.com;
root /basic;
autoindex on;
location / {
}
location /work {
auth_basic "test_work";
auth_basic_user_file password_file;
}
}
[root@oldboy-pythonedu mirror]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy-pythonedu mirror]# systemctl restart nginx
[root@oldboy-pythonedu mirror]# vim /etc/nginx/conf.d/mirror.oldboyedu.com.conf
limit_conn_zone $binary_remote_addr zone=addr:10m; # 定义限制的key, 分配区域大小
server {
listen 80;
server_name mirror.oldboyedu.com;
charset utf8;
limit_conn addr 1; # 调用区域限制,限制key只可以出现1次, 相当于限制来源客户端IP的连接数为1
limit_conn_status 500; # 限制成功后,会返回500的错误状态码,默认返回503
limit_rate_after 200m; # 全速下载200m资源
limit_rate 300k; # 达到200m以后,限制300k的速度
error_page 500 = @testerror; # 如果 出现500错误,则让其跳转到内部的 @testerror
location @testerror { # 定义 @testerror, 返回具体的动作
default_type text/html;
return 200 '$remote_addr 你超过了最大连接限制, 请充值VIP解封!';
}
location / {
root /code/mirror;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
location = /status{
stub_status;
}
Active connections: 2
server accepts handled requests
74 74 104
Reading: 0 Writing: 1 Waiting: 1
Active connections: # 活跃的连接数
accepts: # 接受的总TCP连接数
handled: # 总处理的TCP连接数
requests: # 总的 http 请求数
#作用:控制用户请求uri的具体路径
#用法:location [= | ~ | ~* ] uri {...}
1.location优先级:
# 匹配符 匹配规则 优先级
= 精准匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则 4
/ 通用匹配,任何请求都会匹配 5
2.Location具体如何使用:
server {
listen 80;
server_name location2.oldxu.com;
# 通用匹配,任何请求都会匹配到
location / {
root html;
index index.html;
}
# 精准匹配,必须请求的uri是/nginx_status
location = /nginx_status {
stub_status;
}
# 严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
default_type text/html;
return 200 'php访问成功';
}
# 严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
default_type text/html;
return 200 'jsp访问成功';
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* \.(jpg|gif|png|js|css)$ {
return 403;
}
# 不区分大小写匹配
location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
deny all;
}
}
1.lnmp架构
2.lnmp架构安装
nginx:
php:
[root@oldboy-pythonedu ~]# rpm -e $(rpm -qa |grep php) #卸载php5版本
[root@oldboy-pythonedu ~]# wget http://cdn.xuliangwei.com/php.zip
[root@oldboy-pythonedu ~]# unzip php.zip
[root@oldboy-pythonedu ~]# yum localinstall php/*.rpm -y
# 修改进程运行的身份
[root@oldboy-pythonedu ~]# sed -i 's#user = apache#user = nginx#g' /etc/php-fpm.d/www.conf
[root@oldboy-pythonedu ~]# sed -i 's#group = apache#group = nginx#g' /etc/php-fpm.d/www.conf
# 启动php-fpm
[root@oldboy-pythonedu ~]# systemctl enable php-fpm
[root@oldboy-pythonedu ~]# systemctl start php-fpm
nginx+ php 检查:
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/php.oldboyedu.com.conf
server {
listen 80;
server_name php.oldboyedu.com;
root /code;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 代码:
[root@oldboy-pythonedu ~]# cat /code/index.php
<?php
phpinfo();
?>
mysql:
[root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
[root@oldboy-pythonedu ~]# systemctl enable mariadb
[root@oldboy-pythonedu ~]# systemctl start mariadb
[root@oldboy-pythonedu ~]# mysqladmin password 'Oldxu.com123'
[root@oldboy-pythonedu ~]# mysql -uroot -pOldxu.com123
MariaDB [(none)]>
MariaDB [(none)]> create database wordpress charset utf8;
测试php+mysql是否成功:
[root@oldboy-pythonedu ~]# cat /code/mysql.php
<?php
$servername = "localhost";
$username = "root";
$password = "Oldxu.com123";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php连接MySQL数据库成功";
?>
[root@oldboy-pythonedu ~]# php /code/mysql.php
php连接MySQL数据库成功
#第一步: 下载代码,存储至指定位置,变更权限
[root@oldboy-pythonedu ~]# cd /code/
[root@oldboy-pythonedu code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@oldboy-pythonedu code]# tar xf latest-zh_CN.tar.gz
[root@oldboy-pythonedu code]# chown -R nginx.nginx wordpress/
#第二步: 编写Nginx配置文件
[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/blog.oldboyedu.com.conf
server {
listen 80;
server_name blog.oldboyedu.com;
root /code/wordpress;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@oldboy-pythonedu code]# nginx -t
[root@oldboy-pythonedu code]# systemctl reload nginx
# 第三步: 配置域名解析.访问浏览器.安装该产品
mkdir /code
cd /code
rz #上传文件
tar xf edusoho-8.2.17.tar.gz
#注意:我们的进程能够以什么方式去访问一个文件或目录,取决于进程所运行的用户身份对该文件有什么权限
chown -R nginx.nginx /code/edusoho
vi /etc/nginx/conf.d/edusoho.oldboyedu.conf
server {
listen 80;
server_name edu.oldboyedu.com;
root /code/edusoho/web;
client_max_body_size 1024m; #允许上传视频大小限制
client_body_buffer_size 100m; #缓冲区大小(太小会提示a client request body is buffered to a temporary)
location / {
index app.php;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/udisk {
internal;
root /code/edusoho/app/data/;
}
location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
}
location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
expires 3y;
access_log off;
gzip off;
}
location ~* \.(css|js)$ {
access_log off;
expires 3y;
}
location ~ ^/files/.*\.(php|php5)$ {
deny all;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
include fastcgi_params;
}
}
nginx -t
systemctl restart nginx
vim /etc/php.ini
upload_max_filesize = 1024M
post_max_size = 1024M
systemctl restart php-fpm
上传视频
修改图片
1.kodcloud + oss 对象存储 ( 花钱 ) 200
1) Nginx + PHP 环境
2) kodcloud代码
[root@oldboy-pythonedu ~]# cd /code
[root@oldboy-pythonedu code]# wget http://static.kodcloud.com/update/download/kodbox.1.13.zip
[root@oldboy-pythonedu code]# mkdir kodcloud
[root@oldboy-pythonedu code]# unzip kodbox.1.13.zip -d kodcloud/
[root@oldboy-pythonedu code]# chown -R nginx.nginx /code/kodcloud/
3) Nginx配置文件
[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/kod.oldboyedu.com.conf
server {
listen 80;
server_name kod.oldboyedu.com;
root /code/kodcloud;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@oldboy-pythonedu code]# nginx -t
[root@oldboy-pythonedu code]# systemctl reload nginx
4) 域名解析
2.扩展一台应用节点
1) 克隆一台全新的Linux主机,需要修改IP地址
sed -i 's#old#new#g' /etc/sysconfig/network-script/ifcfg-ens
# old: 旧的IP尾号
# new: 新的IP尾号
[root@oldboy-pythonedu ~]# hostnamectl set-hostname node2
2) 安装Nginx PHP环境
[root@node2 ~]# yum install vim net-tools unzip wget lrzsz -y # 基础工具
[root@node2 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@node2 ~]# wget http://cdn.xuliangwei.com/php.zip
# 安装Nginx
[root@node2 ~]# yum install nginx -y
# 安装PHP
[root@node2 ~]# unzip php.zip
[root@node2 ~]# yum localinstall php/*.rpm -y
3) 拷贝Nginx配置 PHP配置 scp
[root@node2 ~]# scp [email protected]:/etc/nginx/nginx.conf /etc/nginx/nginx.conf
[root@node2 ~]# scp -r [email protected]:/etc/nginx/conf.d/*.conf /etc/nginx/conf.d/
# php
[root@node2 ~]# scp [email protected]:/etc/php.ini /etc/php.ini
[root@node2 ~]# scp [email protected]:/etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf
4) 拷贝代码, 关闭防火墙
[root@node2 ~]# systemctl disable firewalld
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0
[root@node2 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
# 拷贝所有代码
[root@node2 ~]# scp -rp [email protected]:/code /
[root@node2 ~]# chown -R nginx.nginx /code/
5) 启动服务
[root@node2 ~]# systemctl enable nginx php-fpm
[root@node2 ~]# systemctl start nginx php-fpm
201
3.拆分数据库至独立服务器 ( 应用节点可以共享使用, 数据库还可以组集群架构. ) 202
1) 准备基础环境, 修改IP地址,修改主机名称,关闭防火墙
sed -i 's#201#202#g' /etc/sysconfig/network-scripts/ifcfg-ens32
systemctl restart network
hostnamectl set-hostname node-mysql
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
yum install vim net-tools unzip wget lrzsz -y
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2) 安装Mariadb
[root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
[root@oldboy-pythonedu ~]# systemctl enable mariadb
[root@oldboy-pythonedu ~]# systemctl start mariadb
[root@oldboy-pythonedu ~]# mysql
MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'Oldxu.com123';
MariaDB [(none)]>
3) 在原有数据上,将库备份下来,然后恢复至 10.0.0.202 主机的MySQL上
[root@oldboy-pythonedu ~]# mysqldump -uroot -pOldxu.com123 -B wordpress edusoho > bak.sql
[root@oldboy-pythonedu ~]# scp bak.sql [email protected]:~
4) 在新的数据库服务上恢复数据
[root@node-mysql ~]# mysql < bak.sql
5) 修改应用服务连接数据库的地址: ( 所有应用节点都需要操作 )
Wordpress:
[root@node2 ~]# vim /code/wordpress/wp-config.php
define( 'DB_NAME', 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER', 'all' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD', 'Oldxu.com123' );
/** MySQL主机 */
define( 'DB_HOST', '10.0.0.202' );
#edusohu:
[root@node2 ~]# vim /code/edusoho/app/config/parameters.yml
parameters:
database_driver: pdo_mysql
database_host: 10.0.0.202
database_port: 3306
database_name: edusoho
database_user: all
database_password: 'Oldxu.com123'
edusoho存在缓存:
[root@node2 ~]# rm -rf /code/edusoho/app/cache/*
http 用户请求 响应 JAVA
smtp
websocket 用户可以请求, 服务端响应 服务端可以推送数据
uwsgi Python
fastcgi PHP
https
#1) web节点的配置 10.0.0.201
[root@node2 conf.d]# cat proxy.oldboyedu.com.conf
server {
listen 80;
server_name proxy.oldboyedu.com;
root /code/proxy;
location / {
index index.html;
}
}
[root@node2 conf.d]# mkdir /code/proxy -p
[root@node2 conf.d]# echo "node2...." >> /code/proxy/index.html
[root@node2 conf.d]# nginx -t
[root@node2 conf.d]# systemctl reload nginx
#2) 代理节点的配置 10.0.0.100
[root@proxy ~]# systemctl disable firewalld
[root@proxy ~]# systemctl stop firewalld
[root@proxy ~]# setenforce 0
#安装epel\nginx
[root@proxy ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@proxy ~]# yum install vim wget unzip nginx -y
# 清理nginx.conf 无用的配置
# 将nginx加入开机自启\ 启动nginx
[root@proxy ~]# systemctl start nginx
[root@proxy ~]# systemctl enable nginx
# 编写proxy配置文件
[root@proxy ~]# vim /etc/nginx/conf.d/proxy_proxy.oldboyedu.com.conf
server {
listen 80;
server_name proxy.oldboyedu.com;
location / {
proxy_pass http://10.0.0.201; # 后端是什么端口根本不重要
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
}
}
# 检查语法,重载服务
[root@proxy ~]# nginx -t
[root@proxy ~]# systemctl restart nginx
#3) 用户请求代理
抓包分析: 提炼了几个参数:
proxy_set_header Host $http_host; # 将用户请求的域名携带到后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 将用户的真实IP地址,携带到后端,后端有对应的变量解析结果
proxy_http_version 1.1;
#1.多个应用服务器节点:
node1: 10.0.0.200
node2: 10.0.0.201
域名: proxy.oldboyedu.com
node1 nginx配置:
[root@node1 conf.d]# cat /etc/nginx/conf.d/proxy.oldboyedu.com.conf
server {
listen 80;
server_name proxy.oldboyedu.com;
root /code/proxy;
location / {
index index.html;
}
}
[root@oldboy-pythonedu ~]# mkdir /code/proxy -p
[root@oldboy-pythonedu ~]# echo "node1...." > /code/proxy/index.html
[root@oldboy-pythonedu ~]# systemctl reload nginx
#2. node2 nginx配置:
[root@node1 conf.d]# cat /etc/nginx/conf.d/proxy.oldboyedu.com.conf
server {
listen 80;
server_name proxy.oldboyedu.com;
root /code/proxy;
location / {
index index.html;
}
}
[root@oldboy-pythonedu ~]# mkdir /code/proxy -p
[root@oldboy-pythonedu ~]# echo "node2...." > /code/proxy/index.html
[root@oldboy-pythonedu ~]# systemctl reload nginx
#3.通过nginx负载均衡进行轮询调度:
proxy: 10.0.0.100
域名: proxy.oldboyedu.com
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_proxy.oldboyedu.com.conf
upstream node {
server 10.0.0.200:80;
server 10.0.0.201:80;
}
server {
listen 80;
server_name proxy.oldboyedu.com;
location / {
proxy_pass http://node;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
}
}
[root@proxy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@proxy ~]# systemctl reload nginx
# 轮询 默认
# 加权轮询:
upstream node{
server 10.0.0.200:80 weight=5;
server 10.0.0.201:80 weight=1;
}
#ip_hash:固定调度至某一个节点.(session会话保存)
upstream node {
ip_hash;
server 10.0.0.200:80;
server 10.0.0.201:80;
}
#优点解决会话问题
#缺陷:如果来源是一个ip,会导致某个节点非常繁忙,而其他的节 点没有流量,造成负载不均衡的现象
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_blog.oldboyedu.com.conf
upstream blog {
server 10.0.0.200:80;
server 10.0.0.201:80;
}
server {
listen 80;
server_name blog.oldboyedu.com;
location / {
proxy_pass http://blog;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# edu配置
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_edu.oldboyedu.com.conf
upstream edu {
server 10.0.0.200:80;
server 10.0.0.201:80;
}
server {
listen 80;
server_name edu.oldboyedu.com;
location / {
proxy_pass http://edu;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#1.搭建好应用节点 ( 所有节点保持一致 )
[root@oldboy-pythonedu ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.0.3/phpMyAdmin-5.0.3-all-languages.zip
#2.准备phpmyadmin的Nginx配置文件
server {
listen 80;
server_name phpmyadmin.oldboyedu.com;
root /code/phpmyadmin;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@oldboy-pythonedu ~]# unzip phpMyAdmin-5.0.3-all-languages.zip
[root@oldboy-pythonedu ~]# mv phpMyAdmin-5.0.3-all-languages /code/phpmyadmin
#3.配置phpmyadmin连接数据库地址
[root@oldboy-pythonedu ~]# cp /code/phpmyadmin/config.sample.inc.php /code/phpmyadmin/config.inc.php
[root@oldboy-pythonedu ~]# vim /code/phpmyadmin/config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '10.0.0.202'; #配置端口
#4.授权session存储本地目录为进程的用户身份
[root@oldboy-pythonedu ~]# chown -R nginx.nginx /var/lib/php/session
#5.部署node2节点的phpmyadmin, 需要将代码和nginx配置拷贝一份
[root@node2 code]# scp -rp [email protected]:/code/phpmyadmin /code/
[root@node2 code]# chown -R nginx.nginx /code/phpmyadmin/
[root@node2 code]# scp [email protected]:/etc/nginx/conf.d/phpadmin.oldboyedu.com.conf /etc/nginx/conf.d/
[root@node2 code]# chown -R nginx.nginx /var/lib/php/session/
[root@node2 code]# nginx -t
[root@node2 code]# systemctl reload nginx
#6.为应用节点,接入负载均衡
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_phpadmin.oldboyedu.com.conf
upstream php {
server 10.0.0.200:80;
server 10.0.0.201:80;
}
server {
listen 80;
server_name phpmyadmin.oldboyedu.com;
location / {
proxy_pass http://php;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#7.检查轮询是否会造成无法登陆情况, 配置IP_hash测试是否能正常登陆
轮询一定会造成无法登陆成功.
可以采用ip_hash的方式解决.
upstream php {
ip_hash;
server 10.0.0.200:80;
server 10.0.0.201:80;
}
#8.采用Redis共享的方式来解决会话无法登陆的问题, 需要先将负载均衡恢复至轮询模式,然后在继续
#1) 安装Redis 10.0.0.202
[root@node-mysql ~]# yum install redis -y
[root@node-mysql ~]# vim /etc/redis.conf# 添加本机的内网IP地址 ( 不要写错了 ) bind 127.0.0.1 10.0.0.202
[root@node-mysql ~]# systemctl enable redis
[root@node-mysql ~]# systemctl start redis
[root@node-mysql ~]# netstat -lntp | grep redis
tcp 0 0 10.0.0.202:6379 0.0.0.0:* LISTEN 10699/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 10699/redis-server
#2) 通过其他的节点测试是否能正常访问Redis
[root@node2 ~]# yum install redis -y
[root@node2 ~]# redis-cli -h 10.0.0.202
#3) 配置应用节点接入Redis, [ 应用程序php必须有redis的模块,否则无法正常连接 ] 两个节点配置一样,都需要操作
# 将应用程序解析器连接至 Redis
[root@oldboy-pythonedu ~]# vim /etc/php.ini
[Session]
;session.save_handler = files #注释掉
session.save_handler = redis
session.save_path = "tcp://10.0.0.202:6379?weight=1&timeout=2.5"
# 注释如下两行内容
[root@oldboy-pythonedu ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
#重启php-fpm
[root@oldboy-pythonedu ~]# systemctl restart php-fpm
#9.测试是否能正常登陆,然后检查浏览器中的session是否与redis中存储的session一致.
[root@node-mysql ~]# redis-cli
127.0.0.1:6379> keys *
1) "python_key"
2) "PHPREDIS_SESSION:f0ad1e364f79a85bd93b46883403f6ec"
11.配置wsgi
步骤一、安装 python3 的环境
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel \
sqlite-devel gcc gcc-c++ openssl-devel zlib zlib-devel python3 python3-devel -y
步骤二、安装 Django 框架、uwsgi
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==2.1.8
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ uwsgi
步骤三、配置Django工程
[root@oldboy-pythonedu demosite]# cd /opt/
[root@oldboy-pythonedu opt]# django-admin.py startproject demosite
[root@oldboy-pythonedu opt]# cd demosite/
[root@oldboy-pythonedu demosite]# python3 manage.py runserver 0.0.0.0:9999 # 启动测试
步骤四、配置uWSGI、配置Nginx
[root@oldboy-pythonedu opt]# cat /opt/demosite/uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:9999
#uwsgi启动进程数
workers = 2
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi.log
[root@oldboy-pythonedu demosite]# uwsgi --ini /opt/demosite/uwsgi.ini
[root@oldboy-pythonedu demosite]# netstat -lntp | grep 9999
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 9827/uwsgi
# 配置Nginx,将用户发送的http请求, 通过uwsgi_pass 传递给 Uwsgi 服务端
[root@oldboy-pythonedu opt]# cat /etc/nginx/conf.d/uwsgi.oldboyedu.com.conf
server {
listen 80;
server_name uwsgi.oldboyedu.com;
client_max_body_size 100M;
index index.html; #默认返回页面
location / {
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_CHDIR /opt/demosite; #工程所在的路径
uwsgi_param UWSGI_SCRIPT demosite.wsgi; #demosite/wsgi接口文件
include uwsgi_params;
}
}
11.配置程序
1.安装模块
pip3 install -i https://pypi.doubanio.com/simple/ -r XXX.txt
2.配置数据库连接
vim blog_progect/settings.py #创建数据库要指定utf8
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'all',
'PASSWORD': 'Oldxu.com123',
'HOST': '10.0.0.202',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}
3.初始化数据库
python3 manage.py migrate
vim /code/blog_sever/blog_uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:8989
chdir = /code/blog_sever
wsgi-file = blog_progect/wsgi.py
#uwsgi启动进程数
processes = 4
threads = 10
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi-blog.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi-blog.log
4.启动uwsgi
uwsgi --ini /code/blog_sever/blog_uwsgi.ini
netstat -lntp #查看启动端口
(发生错误时 停止:
kill $(ps -ef |grep bbs_uwsgi | grep -v grep | awk '{print $2}' | xargs )
5.配置nginx
vim /etc/nginx/conf.d/pyblog.oldboyedu.com.conf
server {
listen 80;
server_name pyblog.oldboyedu.com;
client_max_body_size 100M;
location /static {
alias /code/blog_sever/static;
}
location / {
uwsgi_pass 127.0.0.1:8989;
include uwsgi_params;
}
}
nginx -t
systemctl reload nginx
1.安装模块
pip3 install -i https://pypi.doubanio.com/simple/ -r XXX.txt
2.配置数据库连接
vim blog_progect/settings.py #创建数据库要指定utf8
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'all',
'PASSWORD': 'Oldxu.com123',
'HOST': '10.0.0.202',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}
3.初始化数据库
python3 manage.py migrate
vim /code/blog_sever/blog_uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:8989
chdir = /code/blog_sever
wsgi-file = blog_progect/wsgi.py
#uwsgi启动进程数
processes = 4
threads = 10
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi-blog.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi-blog.log
4.启动uwsgi
uwsgi --ini /code/blog_sever/blog_uwsgi.ini
netstat -lntp #查看启动端口
(发生错误时 停止:
kill $(ps -ef |grep bbs_uwsgi | grep -v grep | awk '{print $2}' | xargs )
5.配置nginx
vim /etc/nginx/conf.d/pyblog.oldboyedu.com.conf
server {
listen 80;
server_name pyblog.oldboyedu.com;
client_max_body_size 100M;
location /static {
alias /code/blog_sever/static;
}
location / {
uwsgi_pass 127.0.0.1:8989;
include uwsgi_params;
}
}
nginx -t
systemctl reload nginx