הבלוג של ארתיום :: אינטרנט http://artyom.cppcms.com/ בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא! שוחררה גרסה יציבה 1.0.0 של CppCMS המופצת תחת רישיון כפול http://artyom.cppcms.com/post/305 http://artyom.cppcms.com/post/305 <div style="direction:rtl"> <p>היום, אחרי מספר שנות פיתוח, שוחררה גרסה יציבה של CppCMS 1.0.0, אחרי תקופה ארוכה של גרסאות בטא. הגרסה הזו מהווה אבן דרך משמעותית בהתפתחות של CppCMS, הן מבחינה טכנולוגיות והן מבחינה עסקית.</p> <p>החל מגרסה 1.0.0, ספריית CppCMS תהיה זמינה תחת רישיון חופשי LGPLv3 ותחת רישיון מסחרי שיאפשר פיתוח יישומים קנייניים תוך שמירה על שלמות המוצר והגנה על הסודות המסחריים שלו.</p> <p>למידע נוסף על הרישוי החלופי והמחירים אנא כנסו לאתר שלנו:<br/> <a href="http://commercial.cppcms.com">http://commercial.cppcms.com</a></p> <p>גרסה זו, עברה שכתוב יסודי ושינויים ארכיטקטוניים עמוקים שהזניקו את הפופולריות שלה מיד עם שחרור גרסאות בטא ראשונות. מבין החידושים הטכנולוגיים:</p> <ul> <li>הכנסה של API ו־ABI יציבים</li> <li>תמיכה מובנית ב־Ajax ו־Comet</li> <li>שיפורים מהותיים בלוקליזציה</li> <li>תמיכה מובנית ב־Windows</li> <li>שיפורים משמעותיים באבטחה: מסנני XSS וכלים למניעת CSRF ועוד.</li> <li>שרת HTTP מובנה לפיתוח ומערכות משובצות</li> </ul> <p>הענף הישן יציב CppCMS 0.0.x לא נתמך יותר. כל משתמשיי הענף הישן מתבקשים לעבור לגרסה החדשה. יש לציין, לא ידוע לי על משתמש אחד שנשאר עם הגרסה הישנה.</p> </div> על nginx ועל symbolic links http://artyom.cppcms.com/post/304 http://artyom.cppcms.com/post/304 <div style="direction:rtl"> <p>בעקבות <a href="http://oc666.net/2012/01/31/nginx-htaccess-replacement/">הכתבה</a> של <a href="http://oc666.net">עופר כהן</a> הגעתי ל<a href="http://wiki.nginx.org/LikeApache-htaccess">טבלת השוואה</a> מעניינת בין Apache לבין nginx. מה שהפתיע אותי זה שכדי להעביר קובץ <code>http://example.com/site/files/images/layout/header.png</code> השרת nginx מבצע קריאת stat בודדת. הטבלה עשתה השוואה עם apache שעשה O(n)‎ קריאות עבור תיקיה בעומק n לעומת O(1)‎ עבור nginx...</p> <p>ברגע שראיתי את זה נדלקה לי נורת אזהרה! מה עם symbolic links?</p> <p>הסבר: נניח אני איצור קישור סימבולי בשם mypicture.png שיפנה ל־‎/etc/passwd או לקובץ רגיש אחר, אז ע"י גישה לקובץ תמים אני אוכל לקרוא כל קובץ שיש לשרת web הרשאות לקרוא.</p> <p>לכל השרתי web יש אופציה לא לעקוב אחרי קישורים כאלה מטעמי אבטחה וזאת גם אופציה מומלצת לעבודה. מה חשוב, זה שבלתי אפשרי לעשות בדיקה כזו ב־O(1)‎ קריאות מערכת ההפעלה (לפי עומק התיקיה).</p> <p>אז החלטתי לבדוק בעזרת strace, כמה קריאות stats בפועל מבצעים apache,‏ lighttpd ו־nginx כשהאופציה כזו מופעלת וגיליתי... ש־nginx <em>בכלל לא תומך באופציה כזו</em>! קרי הגדרת אבטחה בסיסית ש<strong>כל</strong> שרת אינטרנט החל מ־apache ועד ל־thttpd תומכים בו (אגב גם השרת הפנימי של cppcms) בכלל לא מופיעה בו!</p> <p><a href="http://forum.nginx.org/read.php?21,218970,219019">התשובה</a> (רוסית) של מפתח nginx היא להשתמש ב־<code>mount -o nosymfollow</code> עבור מערכת הקבצים כדי לעקוף את הבעיה.</p> <p>חבל...</p> </div> Nginx? תודה לא... Lighttpd http://artyom.cppcms.com/post/303 http://artyom.cppcms.com/post/303 <div style="direction:rtl"> <p>לאחרונה יש יותר ויותר כתבות על Nginx ועד כמה השרת הזה מעולה. נתח השוק של Nginx לפי הסקירות האחרונות של Netcraft עומד על כ־10%. אז כנראה יש סיבה לכך!</p> <p>עכשיו, דברים שלא מספרים:</p> <ul> <li>רוב שרתי ה־Nginx המופיעים ב־Netcraft עובדים כ־Reverse Proxy או מטפלים בעיקר בקבצים הסטטיים. בהרבה מאוד המקרים Nginx הוא מתפקד כ־Load Balancing Frontend לפי שרתי Apache.</li> <li>התמיכה של Nginx בתוכן דינאמי היא בין מועטה עד לוקה בחסר: <ul> <li>אין תמיכה ב־CGI כלל.</li> <li>אין תמיכה בניהול של שרתי FastCGI, כך שהשירות התוכן הדינאמי שלך חייב לרוץ התהליך נפרד ואתה צריך לדאוג לו (למשל להעלות אם הוא נפל מסיבר כלשהי)</li> <li>הגדרות FastCGI לא תואמות תקן - <code>PATH_INFO</code> לא מוגדר כברירת מחדל. צריך לעבוד קשה כדי שהוא יעבוד נכון. מה שגורם לא מעט בעיות לאלה שמגלים שהיישום שלהם שבור בצורה לא ברור ולא מבינים למה.</li> <li>תמיכה ב־SCGI שבורה לחלוטין. הוא לא מטפל ב־Status כמו שצריך, שזה אומר שרוב ההפניות תהינה שבורות אלא אם היישום שלך ישלח את התשובה כ־HTTP נקי.</li> </ul> </li> </ul> <p>להמשיך?</p> <p>כן, אם אתם צריכים Reverse Proxy או לטפל בתוכן סטטי זהו שרת מעולה. אחרת, תחשבו פעמיים.</p> <p>אני ממליץ בחום על Lighttpd: מהיר כמו Nginx ובנוי על אותם העקרונות, מתועד היטב, מטפל תוכן סטטי ודינאמי בצורה יוצאת מן הכלל. קל לקינפוג ועוד.</p> <p>לפני שאנשים יקפצו ויגידו:</p> <blockquote><p>Lighttpd זולג!</p></blockquote> <p>אז התשובה היא, לא הוא, לא זולג.</p> <p>ציטוט:</p> <blockquote><p>there are no memory leaks just stupid ways to use lighttpd.‎</p> <p>e.g. it is really stupid to stream large files via a fastcgi app, when x-lighttpd-send-file could do a much more efficient job‎</p></blockquote> <p>תקראו עוד:</p> <ul> <li>‏<a href="http://redmine.lighttpd.net/issues/758">http://redmine.lighttpd.net/issues/758</a></li> <li>‏<a href="http://redmine.lighttpd.net/boards/2/topics/4009">http://redmine.lighttpd.net/boards/2/topics/4009</a></li> </ul> </div> הגיע הזמן לשרת וירטואלי פרטי http://artyom.cppcms.com/post/302 http://artyom.cppcms.com/post/302 <div style="direction:rtl"> <p>אחרי חמש שנים שהחזקתי את הבלוג שלי ואת כל האתרים שלי על <a href="http://artyom.cppcms.com/post/15">המחשב הביתי</a>, הגיע הזמן להעביר את התפקיד לשרת וירטואלי אי־שם בענן.</p> <p>הסיבה העיקריות למעבר הן:</p> <ul> <li>Uptime נמוך, בעיקר אודות חברת החשמל וגם מידי פעם תקלות חומרה.</li> <li>חיבור לא אמין במיוחד מחו"ל שגרם לי להחזיק אתר המראה סטטי לפרויקט שלי.</li> </ul> <p>אז הגיע הזמן לשדרג. כיוון שהאתרים שלי רצים על טהרת CppCMS זה לא היה דבר טריביאלי,</p> <ul> <li>מצד אחד, אני צריך שרת וירטואלי עם שליטה מלאה על יכולת התקנת התכנה, כולל התקנה של קובצי הריצה משלי, לכן, שירותי אירוח משותפים לא באו בחשבון, כי רובם לא מותאמים לטכנולוגיות כאלה.</li> <li>מצד שני, ממש אין לי צורך בשרת חזק, בעיקר בגלל שהטכנולוגית CppCMS היא חסכונית להפליא.</li> </ul> <p>אחרי הרבה השוואות של מחירים (לא זולים) של שרתי VPS החלטתי ללכת על Amazon EC2, כיוון שאני משלם על מה שאני משתמש... וחוץ מרוחב הפס אני לא ממש הולך להשתמש בהרבה <code>:-)</code>. לכן, החלטתי ש־Amazon EC2 יהיה אידאלי לטכנולוגיה שאני מציע.</p> <p>ובכן, רכשתי שם המתחם, סידרתי שרת ב־EC2 ותוך זמן קצר עברתי ל־VPS משלי בענן.</p> <p>כרגע יש לי שרת שמריץ lighttpd ומאחוריו שלוש יישומי FastCGI: עבור האתרים:</p> <ul> <li><a href="http://cppcms.com">http://cppcms.com</a> - הויקי של CppCMS‏</li> <li><a href="http://blog.cppcms.com">http://blog.cppcms.com</a> - בלוג הפרויקט</li> <li><a href="http://artyom.cppcms.com">http://artyom.cppcms.com</a> - הבלוג הזה.</li> </ul> <p>השרת מהיר וקל כנוצה עם ערכי uptime:load average שווים ל־0.</p> </div> הבלוג שודרג לגרסה חדשה http://artyom.cppcms.com/post/282 http://artyom.cppcms.com/post/282 <div style="direction:rtl"> <p>שלום לכולם,</p> <p>הבלוג שודרג לגרסה חדשה שעובדת עם הגרסה האחרונה של CppCMS.</p> <p>למעשה מערכת הבלוג שוכתבה מחדש, כיוון הבלוג הזה הוא היישום הראשון שמימשתי בעזרת CppCMS הוא סחב אחרי הרבה קוד מיושן וגרוע. שכתבתי את המערכת מחדש כך שהוא הפך הרבה יותר מאובטח ונקי מבחינת הקוד.</p> <p>אחרי שהוא ירוץ זמן מה ברשת, אני אשחרר גרסה רשמית שלו.</p> <p>אנא שימו לב לבעיות.</p> <p><strong>רוצים לנסות בבית?</strong></p> <p>כרגע אם מישהו רוצה לנסות אותו יצטרך:</p> <ul> <li>CMake 2.6 או יותר</li> <li>CppCMS 0.99.7 או גרסה חדשה יותר</li> <li>CppDB‏</li> <li>ספריית <a href="http://www.pell.portland.or.us/~orc/Code/discount/">Discount Markdown‏</a></li> <li>ספריית ImageMagick++‎ או GraphicsMagick++‎‏.</li> </ul> <p>את הקוד ניתן לקחת מ־svn בכתובת:<br/> <a href="https://cppcms.svn.sourceforge.net/svnroot/cppcms/blog/trunk">https://cppcms.svn.sourceforge.net/svnroot/cppcms/blog/trunk</a></p> <p>אחרי שהתקנתם את כל התלויות ומשכתם גרסת svn של הבלוג:</p> <pre><code>mkdir build cd build cmake .. make </code></pre> <p>לאחר מכן, צרו, בסיס נתונים של MySQL,‏ PostgreSQL או של Sqlite3 בעזרת התסריטים הנמצאים בתת תיקיה sql. ערכו את קובץ config.js כדי להגדיר את בסיס הנתונים בו אתם הולכים להשתמש ואז הריצו:</p> <pre><code>./blog -c ../config.js </code></pre> <p>הגישה הראשונה אתם תתבקשו להזין את ההגדרות הבסיסיות של הבלוג, שם משתמש וססמה אתה תעבדו.</p> <p>בלוג בא בשתי שפות - אנגלית ועברית ומכיל שתי תבניות OrangeSky ו־Contendend לבחירתכם.</p> <p><strong>שימו לב:</strong> מדובר בגרסת בטא ראשונה, כך שאם היא תהרוס לכם את השרת או תאכל לכם את החתול... ראו הוזהרתם.</p> </div> גם Tatoeba תשתמש ב־CppCMS http://artyom.cppcms.com/post/281 http://artyom.cppcms.com/post/281 <div style="direction:rtl"> <p><a href="http://he.wikipedia.org/wiki/%D7%98%D7%98%D7%95%D7%90%D7%91%D7%94">טטואבה</a>, פרויקט בינלאומי המהווה מעין מילון האוסף מספר רב של משפטים, מפתח גרסה חדשה ב־C++‎ שמבוססת על CppCMS.</p> <p>למעשה ידעתי על התכנון הזה כבר מזמן, אבל לא ממש עקבתי אחרי הפרויקט. בעקבות החדשות שכתבתי עליהם <a href="http://art-blog.no-ip.info/newpress/blog/post/280">בפוסט הקודם</a>, החלטתי להסתכל שוב על הפרויקט הזה וגיליתי שהם התקדמו יפה מאוד.</p> <p>גרסת האלפה (עדיין מאוד בסיסית) כבר <a href="http://tatoeba.org/eng/wall/show_message/6217#message_6217">עלתה לרשת</a> וזמינה בכתובת:‏ <a href="http://tato.sysko.fr">http://tato.sysko.fr</a>. הגרסה הזו מחליפה את מנוע החיפוש הנוכחי העובד עם MySQL בבסיס נתונים ייחודי שהם פיתחו ותשתית הרשת שכתובה בעזרת CakePHP מתחלפת באחרת המבוססת על CppCMS.</p> <p><a href="http://tatoeba.org/eng/wall/show_message/4796">בהודעה הזו</a> הם מסבירים את ההחלטה שלהם לבחור ב־CppCMS. להחלטה הזו היה מספר לא מבוטל של סיבות.</p> <p>בקיצור... תתחילו לקחת את CppCMS בצורה רצינית <code>:-)</code></p> </div> CppCMS אי שם בענן http://artyom.cppcms.com/post/280 http://artyom.cppcms.com/post/280 <div style="direction:rtl"> <p>אחת הבעיות הגדולות בצבירת משתמשים פוטנציאליים של CppCMS היא בעצם למצוא משתמשים קיימים מוכרים. שזהוי כמובן בעית הביצה והתרנגלות המוכרת.</p> <p>על־אף של־CppCMS יש <a href="http://news.gmane.org/gmane.comp.lib.cppcms.user">רשימת תפוצה פעילה</a> וידוע לי על לפחות מספר חברות שמשתמשות ב־CppCMS במוצרי embedded שלהם, עדיין רוב המשתמשים לא ממהרים <a href="http://art-blog.no-ip.info/wikipp/en/page/who_uses">לפרסם את עצמם</a> כמשתמשים גאים של שהתשתית המיוחדת הזו.</p> <p>היום בחיפוש פשוט בגוגל על "x-powered-by: cppcms" גיליתי את חברת הזנק הבאה: <a href="http://dhiti.com">http://dhiti.com</a>.</p> <p>הופתעתי לגלות שהיא מפעילה מספר "שירותים בענן" המשתמשים ב־CppCMS, ביניהם: ‏<a href="http://dive.dhiti.com">http://dive.dhiti.com</a>,‏ <a href="http://drilll.com">http://drilll.com</a>,‏ <a href="http://intweetion.com">http://intweetion.com</a>.</p> <p>אלה למעשה שירותים שמבוססים על <a href="http://dhiti.com/api/">RESTful API‏</a> שצד הלקוח (הדפדפן) מתקשר אתם.</p> <p>אחרי שהסתכלתי באתר החברה, נזכרתי שפעם קיבלתי מהם דיווח באג ותיקנתי אותו. אבל לאחר מכן, לא ממש עקבתי אחרי ההתפתחות שלהם... עד היום כשגיליתי שירותים <code>X-Powered-By: CppCMS</code>.</p> <hr /> <p>אני שמח סוף־סוף לראות CppCMS במקום שלו הוא מיועד. אני מאוד מקווה שהפעם יתאפשר לי לספר על הפרויקט הזה <a href="http://wiki.hamakor.org.il/index.php/%D7%90%D7%95%D7%92%D7%95%D7%A1%D7%98_%D7%A4%D7%99%D7%A0%D7%92%D7%95%D7%95%D7%99%D7%9F">באוגוסט פינגווין</a> הקרוב.</p> </div> שוחררה גרסת 0.0.5 של CppCMS (ענף יציב) http://artyom.cppcms.com/post/242 http://artyom.cppcms.com/post/242 <div style="direction:rtl"> <p>שוחררה גרסה חדשה של ענף יציב של CppCMS, שינויים:</p> <h3>תיקוני בעיות אבטחה:</h3> <ul> <li>נכתב מעקף לבעיה של ספריית CgiCC שהיה יכול לגרום ל־DoS.</li> <li>תוקנה בעיה שהייתה עלולה לגרום להווצרות SID בעלי אנטרופיה נמוכה.</li> </ul> <h3>תיקוני באגים:</h3> <ul> <li>תוקן זמן חיים של ערכים "חשופים" בניהול מצב (sessions)</li> <li>תוקן באג שמנע אפשרות עבודה ב־FastCGI/SCGI מעל TCP/IP</li> <li>תוקנו בעיות בניה עם גרסאות Boost לא סטנדרטיות.</li> <li>תוקנו בעיות ביצירת HTTP Status Headers לא נכונים במקרה של שגיאות.</li> <li>תוקנו בעיות בניה עם גרסאות gcc שונות ועם קומפיילר של אינטל.</li> </ul> <h3>שיפורים:</h3> <ul> <li>שופרו זמני בעיות views בצורה משמעות.</li> </ul> </div> נפלאות ה־Comet בשרתי האינטרנט המודרניים... http://artyom.cppcms.com/post/236 http://artyom.cppcms.com/post/236 <div style="direction:rtl"> <p>כפי שפרסמתי לאחרונה, אני עובד על תמיכה ב־Comet או HTTP Push ב־CppCMS. כאשר הכוונה לאפשרות שרת האינטרנט ליידע את הלקוח על אירוע חדש, למשל: "הגיעה מסר מידי חדש, או מחיר המניה השתנה" -- למעשה להעביר אירועים ללקוח בזמן אמת.</p> <p>כיצד התהליך מתבצע? הלקוח פונה לשרת עם בקשת HTTP לקבל עדכונים; והשרת, במקום לענות באופן מידי ממתין ומחזיק את הקשר פתוח. כאשר מגיע האירוע החדש, כמו עדכון מחיר המניה או הודעה חדש מחבר, התשובה נשלחת והתליך חוזר.</p> <p>לא מי יודע מה מסובך כמובן זה גם תלוי ביכולת השרת להחזיק קשר HTTP פתוח למשך הרבה זמן.</p> <p>אבל, מה קורה אם הלקוח סוגר את הקשר לפני שהוא מקבל תשובה? בבקשות HTTP רגילות זה אירוע נדיר והיישום בצד השרת יכול בקלות "להתעלם" ממצב כזה. ביישומי Comet זה שונה: מספיק שמישהו נכנס לאתר שמחכה לדף שמבצע בקשה מסוג זה ויוצא ממנו, הקשר לקבלת עדכונים ייסגר.</p> <p>אבל מה יישום Comet אמור לעשות? תחשבו שמספר הבקשות HTTP שנסגרות לפני דיווח על אירוע מסוים יכול להיות הרבה יותר גדול ממספר התגובות הרלוונטיות בפועל. אז יישום תקין צריך לזהות ניתוקים כאלה, ולמחוק אותם מ"רשימת התפוצה שלו".</p> <p>אבל מה? יישום ה־Comet בד"כ לא מדבר ישירות עם הלקוח בעזרת HTTP אלא מדבר עם שרת web בעזרת פרוטוקול סטנדרטי כמו FastCGI או SCGI. לכן, תפקידו של השרת הוא לדווח ליישום על כך שהלקוח סגר את הקשר. למעשה פרוטוקול FastCGI מגדיר במפורש דרך להפסיק בקשה מסויימת ע"י סגירת ה־socket או שליחת בקשה מיוחדת "Abord Request", כנ"ל ניתן לבצע בעזרת scgi ע"י ניתוק ה־socket.</p> <p>פשוט? כן. האם זה קורה בפועל? לא ממש.</p> <p>אחרי שמימשתי מערכת ניתוק הקשר ובדקתי אותה על שרת http פנימי, החלטתי לבדוק את ההתנהגות של שרתי web אמתיים: Lighttpd,‏ Nginx ו־Apache2. מה שגיליתי היה ממש לא נעים: למעט Nginx אף שרת לא מדווח על ניתוק הקשר לא מעל FastCGI ולא מעל SCGI.</p> <p>לצורך דוגמה פשוטה, אני יצרתי חיבור ומיד סגרתי אותו, כך עשיתי עשר פעם.</p> <ul> <li>Nginx הוא היחיד דיווח על כך ליישום FastCGI באופן מידי ואפשר לי לטפל בלקוח ש"נעלם"</li> <li>Apache דיווח רק אחרי timeout ארוך של כדקה הן ב־FastCGI והן ב־SCGI.‏</li> <li>lighttpd בכלל שכח מזה והחזיק קשרים פתוחים כל הזמן -- יותר מזה בירידה, הוא התלונן על כך שהיישום שלי "נעלם" ולא ענה לבקשת השרת (שאין לו כבר למי להעביר אותה).</li> </ul> <p>בקיצור... זה היה מאוד מאכזב. אני הייתי מוכן לקבל את זה מ־Apache שידוע כשרת שלא נועד לטפל בהרבה קשרים פתוחים, אבל Lighty? <a href="http://redmine.lighttpd.net/issues/2058">פתחתי על זה באג</a>.</p> <p>מזל שמימשתי שרת HTTP פנימי בעצמי.</p> </div> CppCMS פוגש Comet http://artyom.cppcms.com/post/234 http://artyom.cppcms.com/post/234 <div style="direction:rtl"> <p>פרסמתי <a href="http://art-blog.no-ip.info/cppcms/blog/post/47">כאן</a> כתבה על טכנולוגיית <a href="http://en.wikipedia.org/wiki/Comet_(programming)">Comet</a> (או Server Push) הנתמכת בגרסה הבאה של CppCMS.</p> <p>הצגתי כדוגמה קלאסית: מימוש של יישום Chat, בצד הלקוח ובצד השרת, בכ־50 שורות קוד בכל אחד מהם, עם שימוש ב־XHR Long Polling.</p> </div>