nginx优化
工作进程优化
对工作进程的数量和其并发数量进行优化,充分的利用硬件机器资源。
长连接
减少三次握手所花费的时间,对连接进行保持一定时间。
压缩优化
减少带宽,对传输的数据进行压缩,请求到客户机后再进行解压。
客户端缓存优化
减少静态文件如图片等数据传输的占用带宽,将静态数据可以在客户端缓存,刷新时可以在缓存中找到数据,不去服务器上请求。
集群
集群介绍
传统web访问模型:用户体验差

单点故障解决方案:
-
部署一台备份服务器,宕机直接切换
问题:服务器利用率低,成本高,切换不及时,服务器压力依然大。 -
部署多台服务器,根据DNS的轮询解析机制实现用户分发
问题:其中一台故障,就会有一部分用户访问不到网站。 -
多机阵列 ---集群模式
将多个物理机器组成一个逻辑计算机,实现负载均衡和容错。
搭建一个基本集群
在集群中,nginx扮演的角色是:分发器。其任务是接收请求,分发请求,响应请求
功能模块:
ngx_http_upstream_module 基于应用层分发模块
ngx_strean_core_module 基于传输层分发模块(1.9开始提供)
Nginx集群其实是:虚拟主机+反向代理+upstream分发模块组成。
- 虚拟主机:接受和响应请求
- 反向代理:带用户信息去数据服务器拿数据。
- upstream: 告诉nginx去哪个数据服务器拿数据
数据走向:
- 虚拟主机接受请求
- 虚拟主机去找反向代理
- 反向代理让去找upstream
- upstream 告诉一个数据服务器IP
- Nginx去找数据服务器,并发起用户请求
- 数据服务器接收nginx的请求并处理请求
- 数据服务器响应请求给nginx
- nginx响应请求给用户
配置分发器:
在生产环境中,数据服务器必须是一模一样的。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web {
server 192.168.10.42; # 两台分发的数据服务器,upstream根据自己规则分发
server 192.168.10.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web; # 去找名为web的upstream
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
测试
- 测试nginx和数据服务器的连通性
elinks http://192.168.10.42 --dump,所有机器都要测。 - 测试分发,访问nginx服务器
elinks http://192.168.112.128,upstream的默认分发方式是轮询。
nginx的分发算法
将用户分发到不同数据服务器的算法。
- 轮询
- weigth
- ip_hash 相同的ip地址会分发到相同的数据服务器
- 第三方
基于请求头分发
- 基于host分发,也就是基于域名的分发。
upstream web1{
server 192.168.10.42;
}
server {
listen 80; #监听的对外端口
server_name www.web1.com; #域名
location / {
proxy_pass http://web1;
}
}
upstream web2{
server 192.168.10.43;
}
server {
listen 80;#监听的对外端口
server_name www.web2.com;#域名
location / {
proxy_pass http://web2;
}
}
- 基于开发语言分发
http{
upstream php {
server 192.168.10.41;
}
upstream html {
server 192.168.10.42;
}
server {
listen 80;
server_name www.web1.com;
location ~* \.php$ {
proxy_pass http://php;
}
}
server {
listen 80;
server_name www.web2.com;
location ~* \.html$ { # 匹配url是以html结尾的都走html的upstream进行分发
proxy_pass http://html;
}
}
}
- 基于浏览器分发
upstream elinks { server 192.168.10.42; }
upstream chrome { server 192.168.10.43; }
upstream any { server 192.168.10.42:81; }
server {
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://any;
if ( $http_user_agent ~* Elinks ) {
proxy_pass http://elinks;
}
if ( $http_user_agent ~* chrome ) { # ~*模糊匹配,不区分大小写
proxy_pass http://chrome;
}
}
}
- 基于源IP分发,可以根据不同地域分发,即判断出ip是哪些区域的。
geo模块,判断访问nginx的属于哪个地方的
upstream bj.server {
server 192.168.10.42;
}
upstream sh.server {
server 192.168.10.43;
}
upstream default.server {
server 192.168.10.42:81;
}
geo $geo {
default default;
192.168.10.241/32 bj;
192.168.10.242/32 sh;
}
location / {
proxy_pass http://$geo.server$request_uri;
}
部署发布一个python开发的web网站
部署流程
Centos7.5+Nginx+python+Django+uwsgi+mysql
安装pythton
1. 下载 wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
2. 解压 tar xf Python-3.7.1.tar.xz
3. 安装依赖 yum -y install gcc-* openssl-* libffi-devel sqlite-devel
4. 配置安装 当前目录:/usr/local/Python-3.7.1
./configure --enable-optimizations --with-openssl=/usr/bin/ssl
make -j8
make install
默认安装路径是:/usr/local/python3.7
可以安装ipython,比cpython界面友好些, pipp3 install ipython

升级pip3
pip3是python的包管理工具,该工具提供了对python包的查找、下载、安装、卸载功能
pip3 install --upgrade pip
在升级过程中可能会遇到SSL的问题,解决方案:
- cd /usr/local/Python-3.7.1
- vim Modules/Setup
- 将图中红框中代码注释打开
- 重新执行 make -j8 && make install
- pip3 install --upgrade pip

安装vertualenv
virtualenv是一个创建隔绝的Python环境工具,virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用python工程所需要的包。
pip3 install virtualenv
使用:
创建一个虚拟环境:mkvirtualenv -p python3 web
进入一个虚拟环境:source env/bin/activate
退出 虚拟环境:deactivate
安装django
- 在 虚拟环境中安装django
pip3 install Django==2.1.2
![]()
- 在/user/local/nginx/html下创建一个django项目
django-admin startproject myweb
安装uwsgi
uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回。
- 安装
pip3 install uwsgi - 创建配置文件
mkdir /etc/uwsgi vim /etc/uwsgi/uwsgi.ini
[uwsgi]
uid = root
gid = root
socket = 127.0.0.1:9090
master = true
vhost = true
no-site = true
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid
daemonize = /var/log/uwsgi9090.log
# 虚拟环境下diango所在的位置
pythonpath = /usr/local/Python-3.7.1/web/lib/python3.7/site-packages
- 启动uwsgi
uwsgi --ini /etc/uwsgi/uwsgi.ini

发布网站
1.编辑nginx配置 文件
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
uwsgi_param UWSGI_SCRIPT myweb1.wsgi;
uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/myweb1; # django项目地址
index index.html index.htm;
client_max_body_size 35m;
uwsgi_cache_valid 1m;
uwsgi_temp_file_write_size 64k;
uwsgi_buffers 8 64k;
uwsgi_buffer_size 64k;
uwsgi_read_timeout 300;
uwsgi_send_timeout 300;
uwsgi_connect_timeout 300;
}
2.启动nginx
3.测试,小火箭就出来了。

修改了django的代码或者配置文件都要重启uwsgi。
请求顺序


浙公网安备 33010602011771号