
難波0:はじめに
ある日、思慮深くバショルグをめくって、私は突然、ほとんどの引用が非常に長く、非常にしばしば読むのが面倒だと気づきました。 一般的なラッシュの時代に-それは多くの時間がかかります。 したがって、新しい形式が生まれました: Shorts (英語の単語Short-shortから)。 ショートはショート(1つか2つのセンテンスから)ジョークで、厳密に255文字に制限されています(一般的ではないように)。
その瞬間、私はプログラミングを学びたかったので、簡単なタスクを探していました。 すぐにサイトを投稿しました-数晩、同僚にIRCの仕事と知り合いについて話しましたが、2日後に500人がサイトにアクセスし、その3分の1近くがサインアップしたことを突然知りました。 RSSフィード。 人々がこのコンセプトを気に入っていることが明らかになりました。 サイトを少し外から舐めたので、私はそれをKhabrasocietyに見せることにしました-ショートパンツは短くて面白いです 、愛してください。
PSこれがスタートアップではないことを考えると(プロジェクトはまだ商業的ではなく、「スタートアップ」は私の技術にとって大きすぎる言葉です)、このサイトに長年滞在してきたhabrasの良心により、技術的でない記事を書くことができませんでした。 したがって、カットの下で、Habraeffect用にShortikiを準備した方法に関する興味深い話を見つけることができます。
なんば1:リソース
Webプロジェクト、特にスタートアップは、さまざまな理由(大規模なリソース(Habréなど)での記事の発行、プレスリリース、広告キャンペーン、ニュースでの予想外の言及など)により、常にトラフィックの急激な流入があります。 多くの場合(最後の例のように)、トラフィックの急増が突然発生します。
これは重要な結論につながります-もちろん、200ルーブルの最初のVPSに1日あたり10万人の参加者を持つリソースを配置することは可能です。 これは、オタクの友人の輪に誇りを持つ大きな理由になりますが、最も重要な瞬間にサイトの崩壊につながる可能性が高いです。 一般に、Webプロダクションシステムが通常モードで動作するのは、その容量の10%以下である場合に適しています。 これにより、彼女は出席者の急増時に耐えることができます。 これらすべてに基づいて、まともな電力の供給があるサーバーにショーツなどの「軽量」サイトを配置することをお勧めします。
Namba 2:フロントエンドとバックエンド
Web最適化の最初の教訓の1つは、静的コンテンツと動的コンテンツを分離することです。 これを標準ソリューションにします。フロントエンドに対するNginx、Apacheは127.0.0.1でリッスンします。 Nginxは静的コンテンツを提供し、リクエストが動的になることを確認すると、リクエストを「内部」でApacheに送信します。
server {
listen 10.0.121.124:80;
server_name shortiki.com www.shortiki.com;
#
if ($host = 'www.shortiki.com' ) {
rewrite ^/(.*)$ http://shortiki.com/$1 permanent;
}
access_log /var/log/vhosts/nginx-shortiki.com-access.log main;
# , . .
location ~ ^.+\.(html|jpg|jpeg|gif|png|ico|css|js)$ {
root /usr/home/vhosts/shortiki;
expires 30d;
access_log off;
}
location / {
proxy_pass http://127.0.0.1:8081;
# ,
}
}
* This source code was highlighted with Source Code Highlighter.
3: MPM
Apache MPM (Multi-Processing Modules, , - / , ) – prefork worker.
Prefork – , , . Prefork , worker.
Worker , , , . worker , , , , , . , , , , worker.
4: Accept-
Accept- ( ) , , - , HTTP .
FreeBSD, , :
# kldload accf_http
, :
echo 'accf_http_load="YES"' >> /boot/loader.conf
, :
AcceptFilter http httpready
nginx:
listen 10.0.121.124:80 default sndbuf=16k rcvbuf=8k accept_filter=httpready
-:
/usr/local/etc/rc.d/nginx reload
/usr/local/etc/rc.d/apache22 restart
5: Apache
Apache — . , , :
MaxClients – , , . MaxClients = 300, 301 , , , , . , MaxClients, – 300 . MaxClients :
MaxClients = /
Apache RSS top ps.
AllowOverride:
<Directory />
AllowOverride none
</Directory>
* This source code was highlighted with Source Code Highlighter.
, , , .htaccess.
ExtendedStatus ( 1 2 ):
ExtendedStatus Off
FollowSymLinks -, Apache :
<Directory />
Options FollowSymLinks
</Directory>
* This source code was highlighted with Source Code Highlighter.
:
Timeout 10
( ):
<Location />
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript
</Location>
* This source code was highlighted with Source Code Highlighter.
MinSpareServers MaxSpareServers – , , « ». , , MinSpareServers 2, 2 , . , – , , , , , / .
MinSpareServers 2
MaxSpareServers 8
, 2 , , 8 – , .
:
MinSpareServers 8
MaxSpareServers 32
StartServers – , Apache . StartServers MinSpareServers, MinSpareServers. , :
StartServers 8
MaxRequestPerChild , . , . – , 10000 , 10000 , .
MaxRequestPerChild 3000
KeepAlive – , TCP , . KeepAliveTimeout , .. , .
KeepAlive On
KeepAliveTimeout 5
6: PHP
, php php memcache memcached , . FreeBSD :
cd /usr/ports/databases/pecl-memcache
make install clean
cd /usr/ports/databases/memcached
make install clean
7:
, — . , . SQL , 20 :
SELECT sid, sdate, stext, srating FROM quotes ORDER BY id ASC LIMIT $shortik_first, $shortiks_main
* This source code was highlighted with Source Code Highlighter.
, , :
// Memcached
$mem = new Memcache();
$mem->connect('localhost', 11211);
//
$quotesonpage = '';
//
if ( !$mem->get['s_main'] ) {
// - MySQL...
$connect = @mysql_connect ($server, $user, $pass) or die('Could not connect: ' . mysql_error());
@mysql_select_db("ShoDB");
$query = "SELECT sid, sdate, stext, srating FROM quotes ORDER BY id ASC LIMIT $shortik_first, $shortiks_main";
@mysql_set_charset('utf8',$connect);
$get_smain = mysql_query ($query) or die('Cannot execure query: ' . mysql_error());
$quotesonpage = array();
while ($shortik = mysql_fetch_assoc($get_smain)) {
$quotesonpage[] = $shortik;
}
$quotesonpage = array_reverse($quotesonpage);
// ... memcache, (1800 ).
$mem->set('quotes', $quotesonpage,MEMCACHE_COMPRESSED,1800);
} else {
$quotesonpage = $mem->get['quotes'];
}
* This source code was highlighted with Source Code Highlighter.
, , MySQL . , , .
8: :)
! , , .
, , ,