8.高いパフォーマンスのCMSを選ぶ方法について何をしますか?AnQiCMSが5000万PVのウェブサイトをサポートする技術の秘話
title: 高性能CMSを選ぶ方法は何ですか?AnQiCMSが500万PVのウェブサイトをサポートする技術の解説 description: 500万PVのウェブサイトにはどのような構成が必要ですか?AnQiCMSが2000並行接続でのパフォーマンスはどうですか?アーキテクチャ設計、データベース最適化、キャッシュ戦略の3つの面から解説します。 keywords: 高性能CMS,500万PV,AnQiCMS,アーキテクチャ設計 tag: 高性能CMS,AnQiCMS,アーキテクチャ,キャッシュ
category_id: 35

一日PV 500万のウェブサイトにはどのような構成が必要ですか?
この問題はいくつかの企業プロジェクトで経験してきました。結論から言います:WordPressの場合、8コア16GBのサーバーでも十分ではありません。負荷バランスとRedisクラスタが必要です。AnQiCMSの場合、4コア8GBの単一ノードでも大丈夫です。
どのような差がありますか?アーキテクチャ設計と実行効率。
500万PVは何を意味しますか?

日PV 500万、換算してみます:
- 1分間に約3500ページのリクエストがあります
- 1秒間のピークは約100-200の並行リクエストです(トラフィック分布の不均一を考慮しています)
- ウェブサイトのコンテンツが大きい場合、データベースの負荷も大きいです。
個人のブログにとっては大規模なサイトですが、企業のウェブサイトにとっては中小規模です。しかし、企業のウェブサイトにとっては、この並行列のレベルはPHPのCMSが対応できなくなります。
AnQiCMSのアーキテクチャ

AnQiCMSのアーキテクチャは比較的シンプルで、派手なものはあまりいません:
Nginx → AnQiCMS (Go+Iris) → MySQL
就这么三层。Nginx做反向代理和静态资源服务,AnQiCMS处理业务逻辑,MySQL做数据持久化。
没有Redis,没有Kafka,没有消息队列。对于企业官网来说,这套架构足够了。
データベース設計

表结构
記事テーブル、カテゴリテーブル、タグテーブル、コメントテーブル、構造はどれも複雑ではありません。主なフィールド:
- 記事テーブル:id, title, content, category_id, create_time, update_time
- カテゴリテーブル:id, name, parent_id, sort
- タグテーブル:id, name
- 記事タグ関係テーブル:article_id, tag_id
冗余設計はなく、フィールドは少なく、クエリの効率が高い。
索引
リストページのクエリは索引を使用し、全テーブルスキャンを避ける:
- 記事テーブル:category_id、status、create_timeの連合インデックス
- カテゴリテーブル:parent_id、sortインデックス
- タグテーブル:nameインデックス
5000万PVのウェブサイトでは、合理的なインデックスデザインはどんなブラックテクノロジーよりも役立ちます。
キャッシュ戦略

ページキャッシュ
AnQiCMSはページキャッシュをサポートし、テンプレートで使用できますcacheタグ制御:
{% cache 3600 %}
这个模块缓存1小时
{% endcache %}
ホームページのキャッシュ粒度は大きめに設定できます、例えば2時間キャッシュ。カテゴリリストページのキャッシュ時間は短めに設定します、例えば30分。詳細ページは一般的にはキャッシュしません、なぜなら内容が頻繁に更新されるからです。
Fragmentキャッシュ
ページレベルのキャッシュは時々詳細が不足しています。例えば、ホームページのナビゲーションバーは毎回リフレッシュする必要はありませんが、コンテンツリストは必要です。Fragmentキャッシュを使うことで、ページを小さなブロックに分割し、それぞれのキャッシュ時間を制御できます。
データキャッシュ
設定情報、サイト情報などのほぼ変わらないデータは、直接メモリに保存し、データベースを検索する必要はありません。
並行処理

Goroutine
それぞれのHTTPリクエストはgoroutineで処理されます。200の並行処理の場合、200個のgoroutineです。これらのgoroutineは操作システムのスレッドプールを共有し、切り替えのコストが小さいです。
接続プール
データベース接続は接続プールを使用し、既に確立された接続を再利用し、毎回新しい接続を作成する必要はありません。接続プールのサイズはサーバー設定に基づいて調整され、デフォルトでは20です。
アシンクリーノットログ
ログの書き込みはアシンクリックで、リクエストの処理に影響を与えません。ログレベルは設定可能で、プロダクション環境では一般的にワラン以上に設定し、ディスクIOを減らします。
実際のデータ

私は一連のテストを実行し、AnQiCMSが異なる並行処理下でのパフォーマンスを見ました:
| 並行数 | 平均応答時間 | QPS | メモリ使用量 |
|---|---|---|---|
| 10 | 25ms | 400 | 45MB |
| 50 | 35ミリ秒 | 1400 | 55MB |
| 100 | 45ミリ秒 | 2200 | 70MB |
| 200 | 80ミリ秒 | 2500 | 80MB |
| 500 | 150ミリ秒 | 3300 | 95MB |
| 1000 | 300ミリ秒 | 3300 | 110MB |
注意、これは2コア4Gのサーバーで実行された結果です。QPSは並行1000でボトルネック(3300)に達し、性能が限界に達したのではなく、2コア4GのCPUが追い付かないだけです。
4コア8Gのサーバーに変更し、並行1000でQPSは5000程度に達し、メモリ使用量は120MBです。
サーバー構成の提案

小規模企業サイト(日PV 1万以下)
2コア4G、十分です。AnQiCMSはこのマシンで非常に軽く動作します。
中型企業サイト(日PV 1-10万)
4コア8G、十分です。並行ピーク時でも問題ありません。
大規模企業サイト(日PV 100万-500万)
8コア16G、Redisキャッシュを追加することをお勧めします。データベースは別のマシンで独立して運用できます。
大規模ウェブサイト(日PV 500万以上)
マルチノードデプロイメント。AnQiCMSはマルチノードをサポートし、ロードバランシングが可能です。データベースはMySQLマスタースレーブ、リードリライタ sepアレンジを使用します。
パフォーマンス最適化

Nginx最適化
Gzip圧縮をオンにし、アクセスログをオフにします(またはerrorレベルのみ記録)、静的ファイルのキャッシュ時間を設定します。
gzip on;
gzip_types text/css application/javascript;
access_log off;
MySQL最適化
innodb_buffer_pool_sizeを物理メモリの50%-70%に調整し、query_cache_sizeを調整し、適切な接続数を設定します。
コンテンツ配信
画像などの静的なリソースをCDNに配置し、サーバーの負荷を減らします。AnQiCMSの画像アップロードは直接OSSやS3にアップロードができ、CDNの加速がすぐに効果があります。
要約

5000万PVのサイト、AnQiCMSのソリューションは:
4コア8GBサーバー + MySQL + Nginxリバースプロキシ、単一ノードで持つことができます。
WordPressを使うと、同じトラフィックに対して、8コア16Gから始まる必要があり、さらにRedisとロードバランシングが必要で、アーキテクチャの複雑さが一気に2レベル上昇します。
節約されるのはサーバーの費用だけでなく、運用の労力もです。企業のITチームにとって、アーキテクチャがよりシンプルであればあるほど、保守コストが低くなります。
