MENU

Category: web »

nginx最大连接压测和调优

nginx是非常高性能的web服务,交付web服务时我非常想知道它究竟能承载的多少并发量??我们知道影响服务性能的因素有很多如出口带宽、磁盘io、内存和cpu资源;ok 今天就来测试一把看看如何充分使用nginx性能。

环境:
主机资源:aliyun 2核4G
操作系统: centos7
网络环境: 阿里云vpc内网
version: openresty/1.13.6.2

涉及环境调优

通过ulimit,sysctl命令检查系统环境限制,不展开说明

nginx 配置

cat /proc/cpuinfo | grep processor
# 查看cpu核数

cat /nginx.conf

worker_processes  2; #cpu核数,建议不大于8
events {
    worker_connections  10240;
}

server {
listen 80 default_server;
default_type application/json;
server_name _;
return 200 '{"date":"$time_local","host":"web-test1","result":"nginx json"}';
access_log  /usr/local/nginx/logs/default.log;
}

压测调用

wrk  -t2  -c40000 -d120s http://172.16.140.128
# t多少线程 c连接数 d压测时间;线程数不宜过多,核数的2-4倍

根据系统资源情况调整worker_connectionsworker_processes来限制nginx可用客户端连接数;


正常web服务

客户端最大连接数 = worker_processes * worker_connections

nginx反向代理

#作为反向代理,因为浏览器默认会开启2个连接到server,而且Nginx还会使用fds(file descriptor)从同一个连接池建立连接到upstream后端

   nginx作为http服务器的时候:
    max_clients = worker_processes * worker_connections/2
   nginx作为反向代理服务器的时候:
    max_clients = worker_processes * worker_connections/4

或者从一般建立连接的角度:客户并发连接为1.

   nginx作为http服务器的时候:
    max_clients = worker_processes * worker_connections
   nginx作为反向代理服务器的时候:
    max_clients = worker_processes * worker_connections/2

参考
http://blog.51cto.com/liuqunying/1420556

nginx生成自签SSL证书

生成ssl证书

mkdir /usr/local/nginx/conf/ssl
cd !$
# 新建目录

openssl genrsa -des3 -out tmp.key 1024
#  输入密码后,再次重复输入确认密码
openssl rsa -in tmp.key -out example.com.key
# 转换key,取消密码

Read More

快速配置django rest-framework框架

  1. 建立 Models
  2. 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示)
  3. ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
  4. 权限 Premissions 也在这一步做处理
  5. ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
  6. 在 urls 里注册 ViewSet 生成的 view,指定监听的 url

Read More

创建教程modle

添加应用

python manage.py startapp tutorials  #添加应用

vi mysite/settings.py

INSTALLED_APPS = [
...

'tutorials',
]

## 设计表结构
vi tutorials/models.py

from django.db import models
from django.utils import timezone

class Tutorial(models.Model):  # 专题教程
    """
    继承django.db.models.Models模块
    """
    name = models.CharField(verbose_name='专题教程', max_length=100)

    def __str__(self):
        return self.name



class Article(models.Model):
    """
    文章的数据库表稍微复杂一点,主要是涉及的字段更多。
    django会自动新建自增id作为主键
    """
    title = models.CharField(verbose_name='标题', max_length=70)  # 标题
    body = models.TextField(verbose_name='正文', blank=True, null=True)  # 文章正文
    publish = models.DateTimeField(verbose_name='发布时间', default=timezone.now)  # 发布时间
    mod_date = models.DateField(verbose_name='更新时间', auto_now=True)  # 更新时间
    tutorial = models.ForeignKey(Tutorial, verbose_name='专题教程', on_delete=models.CASCADE)  # 教程
    view = models.BigIntegerField(verbose_name='阅读数', default=0)  # 阅读数

    def __str__(self):
        return self.title

    def viewed(self):
        """
        增加阅读数
        :return:
        """
        self.view += 1
        self.save(update_fields=['view'])

vi tutorials/admin.py

from django.contrib import admin

from.models import Tutorial,Article
class TutorialList(admin.ModelAdmin):
    list_display = ['title','publish','mod_date','tutorial','view']


admin.site.register(Tutorial)
admin.site.register(Article,TutorialList)

数据库

python manage.py makemigrations #为改动创建迁移记录
python manage.py migrate #将操作同步到数据库

from tutorials.models import Tutorial,Article