рдХрд╕реНрдЯрдо рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдереЛрдбрд╝рд╛ рдЧреЗрдп рдкрд░рд┐рдЪрдп


рдХрд┐рд╕реА рддрд░рд╣ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдерд╛ рдЬреЛ рдПрдХ рдЕрдЬреАрдм рдЪрд╛рд╣рддрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдкреНрд░рдмрдВрдзрд┐рдд рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреИрдореНрдкрд┐рдВрдЧ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░рд╛рдорд╡рд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд░ рдкрд░ FreeBSD 9.0 рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ nginx, thin server рдФрд░ ezjail рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрд▓ рдкреНрд░рдмрдВрдзрди рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛)ред рдПрдХ рд╣рдлреНрддреЗ рдмрд╛рдж, рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Apple рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдерд╛ рдФрд░ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рдкрд░ рдЙрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдЫреВрдиреЗ рдореЗрдВ рдХреЛрдИ рдЦреБрд╢реА рдирд╣реАрдВ рд╣реБрдИ рдереАред рдпрд╣ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рдереАред рдХреЗрд╡рд▓ рдПрдХ "рд▓реЗрдХрд┐рди" рдерд╛ - рдореИрдХрдУрдПрд╕ рдПрдХреНрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдИ рдЬреЗрд▓ (8) рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ (рдореИрдВ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЪреЗрд░реЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛), рдореБрдЭреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд▓рдЪреАрд▓рд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рдЯреВрд▓ рдорд┐рд▓рд╛ - рд╕реИрдВрдбрдмреЙрдХреНрд╕ ред

рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рд╕реИрдВрдбрдмреЙрдХреНрд╕

рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдПрдХ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдирд┐рдХрд▓рд╛ред рдХреБрдЫ AppArmor рдХреА рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреА рд╣реИ, рдХреБрдЫ SeLinux, рдФрд░ рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреЛрдЦреЗ рддрд░реАрдХреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЬрд╛рдВрдЪ рдореЗрдВ рд░рдЦрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВред рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИ, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдпреБрдХреНрдд рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓)ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕реИрдВрдбрдмреЙрдХреНрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдордЬрд╝реЛрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ (рдлреНрд░реАрдмреАрдПрд╕рдбреА рд╣реИрдВрдбрдмреБрдХ рдбрд┐рдЯреЗрд▓ рдХреЙрд░реБрдкреЗрдЯреНрд╕) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдереЗ, рдЬрд┐рд╕рдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд╣рд▓реНрдХреЗ рдкрддрд▓реЗ рд░реВрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдХреЛрдИ рднреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдФрд░, рдЕрдзрд┐рдорд╛рдирддрдГ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреАрддрд┐ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ)ред рд╕рднреА рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рдЙрдирдХреЗ рд╕реЗрдЯ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИрдВред рдирд┐рдпрдореЛрдВ рдХреЗ рджрд╛рдпрд░реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдиреАрддрд┐ рдХреЗ рдирд╛рдо (рдпрд╛ "рдСрдкрд░реЗрд╢рди" - рд╕рдВрдЪрд╛рд▓рди) рдорд╛рд╕реНрдХ (рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб - *) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд▓реНрдЯрд░ (рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 6 рд╣реИрдВ: рдкрде рдиреЗрдЯрд╡рд░реНрдХ рдлрд╝рд╛рдЗрд▓-рдореЛрдб xattr рдордЪ рд╕рд┐рдЧреНрдирд▓) рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ ( рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдЦреЗрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрде рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рд░реЗрдЧреЗрдХреНрд╕) рдФрд░, рдореБрдЭреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, "рдЙрдкрдкрде"ред рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ '?' рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ:
; ; Sandbox profile for application owned by virtual (non-system) user XXXXXX ; (version 1) ;     (deny default) ;           ; (,      unix-).  ;  ,       ; unix- (allow network-bind) ;   Thin       (. ) ;  ,   fork() (allow process-fork) ;      DirectoryService       ;  ,      . (allow mach-lookup (global-name "com.apple.system.DirectoryService.libinfo_v1") (global-name "com.apple.system.DirectoryService.membership_v1") ) ;       Thin-,   ruby ;  - -  ,    ;-) (allow process-exec (regex "^/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr") (regex "^/usr/bin/thin$") ) ;   ,        file-read   ; ,   regex ^/opt/sandbox/apps/XXXXXX ;    -  ,    -  (allow file-read-metadata (literal "/opt/sandbox/apps/XXXXXX/log") (literal "/opt/sandbox/apps/XXXXXX/tmp") ) ;     gem',         (allow file-read* (literal "/usr/bin/thin") (regex "^/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr") (regex "^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent") (regex "^/Library/Ruby/Gems/1.8/") (regex "^/usr/lib") (regex "^/opt/sandbox/apps/XXXXXX") ) ;       , -  . (allow file* (regex "^/opt/sandbox/apps/XXXXXX/tmp/thin.sock$") (regex "^/opt/sandbox/apps/XXXXXX/tmp/thin.pid$") (regex "^/opt/sandbox/apps/XXXXXX/log/thin.log$") ) 


рдкрддрд▓рд╛

рдХрд╕реНрдЯрдо рдХреИрдореНрдкрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдерд┐рди рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдореЛрдВрдЧрд░реЗрд▓, рдкреИрд╕реЗрдВрдЬрд░, uWSGI рдпрд╛ рдХреБрдЫ рдФрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдмрд╣реБрдд рдорд╛рдВрдЧ рдирд╣реАрдВ рдереА (рдЧрдВрднреАрд░ рдЕрдзреНрдпрдпрди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрд╛ рдХрд┐ рдкреИрд╕реЗрдВрдЬрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рдерд╛ (рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдУрд░ рд╕реЗ рдирдЧрдиреЗрдХреНрд╕ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд▓реЗрддрд╛, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкрд╕рдВрджреАрджрд╛ рд╣рд╛рд░рд╡реЗрд╕реНрдЯрд░ - рдЕрдВрддрд┐рдо рдЯрд┐рдк рд╕реЗ uWSGI - рдлреНрд░реАрдмреАрдПрд╕рдбреА рдкрд░ рд░реИрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ (рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рднреАрддрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдЯреНрд░реЗрди рдЫреВрдЯ рдЧрдИ), рдФрд░ рдореИрдХрдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореЛрдВрдЧрд░реЗрд▓ рдХреЗ рдкрд╛рд╕ рдерд┐рди рдкрд░ рд░реБрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рд╣реБрдЖред рддреЛ, рдпрд╣рд╛рдБ рдерд┐рди рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреИрдореНрдкрд┐рдВрдЧ рд░реИрдХ-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рд▓реЙрдиреНрдЪ рд▓рд╛рдЗрди рд╣реИ:

 cd /opt/sandbox/apps/XXXXXX && \ sandbox-exec -f /opt/sandbox/profiles/XXXXXX.sb \ /usr/bin/thin --socket /opt/sandbox/apps/XXXXXX/tmp/thin.sock \ --rackup /opt/sandbox/apps/XXXXXX/approot/config.ru \ --environment production --timeout 4 --chdir /opt/sandbox/apps/XXXXXX/approot \ --log /opt/sandbox/apps/XXXXXX/log/thin.log \ --daemonize --pid /opt/sandbox/apps/XXXXXX/tmp/thin.pid \ --user thinbot --group thinbot --tag XXXXXX start 


'рдЯреИрдЧ' рд╡рд┐рдХрд▓реНрдк рд╢реАрд░реНрд╖ рдФрд░ рдкреАрдПрд╕ рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рднреА рд▓реЙрдиреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдХреЗрд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЦрд╛рдпрд╛ред

nginx

рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИред рдХреЛрдИ рдЖрдБрдХрдбрд╝реЗ рдирд╣реАрдВред рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдХрд╛ рдирд╛рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдЙрдкрдбреЛрдореЗрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
  server { server_name ~(.+).domain.tld; set $user $1; location / { proxy_pass http://unix:/opt/sandbox/apps/$user/tmp/thin.sock:/; } } 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ

рдореИрдВрдиреЗ рдмрдВрдзрди рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рд░рд▓ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЪреАрдЬреЗрдВ рдкрд╕рдВрдж рд╣реИрдВред рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд╣реБрдд рдирдо рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд░реВрдЯ (рдореВрд▓) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрднрд╛рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрди - users_management.sh:
 #!/bin/sh # Mike Kuznetsov 2012 mike4gg@gmail.com user=$1 action=$2 usage() { echo "Usage: `basename $0` <username> <create|remove|list>" exit } if [ "${action}x" = "x" ]; then usage fi sb_app_dir=/opt/sandbox/apps/${user} sb_app_root=${sb_app_dir}/approot sb_profile=/opt/sandbox/profiles/${user}.sb thin_sock=${sb_app_dir}/tmp/thin.sock thin_pid=${sb_app_dir}/tmp/thin.pid thin_log=${sb_app_dir}/log/thin.log thinuser=thinbot thingroup=thinbot create_sandbox() { cat <<EOF > ${sb_profile} ; ; Sandbox profile for application owned by virtual (non-system) user ${user} ; (version 1) (deny default) (allow network-bind) (allow process-fork) (allow mach-lookup (global-name "com.apple.system.DirectoryService.libinfo_v1") (global-name "com.apple.system.DirectoryService.membership_v1") ) (allow process-exec (regex "^/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr") (regex "^/usr/bin/thin$") ) (allow file-read-metadata (literal "${sb_app_dir}/log") (literal "${sb_app_dir}/tmp") ) (allow file-read* (literal "/usr/bin/thin") (regex "^/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr") (regex "^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent") (regex "^/Library/Ruby/Gems/1.8/") (regex "^/usr/lib") (regex "^${sb_app_dir}") ) (allow file* (regex "^${thin_sock}$") (regex "^${thin_pid}$") (regex "^${thin_log}$") ) EOF mkdir ${sb_app_dir} mkdir ${sb_app_root} mkdir ${sb_app_dir}/tmp mkdir ${sb_app_dir}/log chown -R ${thinuser}:${thingroup} ${sb_app_dir} } case ${action} in create) if [ -d ${sb_app_dir} ]; then echo "User's application directory ${sb_app_dir} exists. Exiting" usage elif [ -f ${sb_profile} ]; then echo "User's sandbox profile ${sb_profile} exists. Exiting" usage fi printf "Creating sandbox for user ${user}... " create_sandbox echo "done" ;; remove) printf "Removing sandbox for user ${user}... " if [ -f ${thin_pid} ]; then /usr/bin/thin --pid ${thin_pid} stop > /dev/null 2>&1 fi if [ -d ${sb_app_dir} ]; then rm -r ${sb_app_dir}; fi if [ -f ${sb_profile} ]; then rm ${sb_profile}; fi echo "done" ;; list) printf "Username\tApplication state\tPID\tMemory usage\n" echo "-----------------------------------------------------------------" total_mem=0 for user_ in `ls /opt/sandbox/apps` do if [ -f /opt/sandbox/apps/${user_}/tmp/thin.pid ]; then pid_=`cat /opt/sandbox/apps/${user_}/tmp/thin.pid` ps ax | grep ^${pid_} > /dev/null if [ $? -eq 0 ]; then mem_=`ps -p ${pid_} -o rss | tail -1 | awk '{ print $1 }'` mem=`expr ${mem_} \/ 1024` total_mem=`expr ${total_mem} + ${mem}` printf "${user_}\t\trunning\t\t${pid_}\t\t${mem}Mb\n" else printf "${user_}\t\tnot running\n" fi else printf "${user_}\t\tnot running\n" fi done echo "-----------------------------------------------------------------" printf "Total memory usage: ${total_mem}Mb\n" ;; *) usage ;; esac 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рдмрдВрдзрди - application_management.sh:
 #!/bin/sh # Mike Kuznetsov 2012 mike4gg@gmail.com user=$1 action=$2 sb_app_dir=/opt/sandbox/apps/${user} sb_app_root=${sb_app_dir}/approot sb_profile=/opt/sandbox/profiles/${user}.sb thin_sock=${sb_app_dir}/tmp/thin.sock thin_pid=${sb_app_dir}/tmp/thin.pid thin_log=${sb_app_dir}/log/thin.log thinuser=thinbot thingroup=thinbot exitcode=0 usage() { echo "Usage: `basename $0` <username> <start|stop|restart>" exit 0 } start_thin() { if [ -f ${thin_pid} ]; then pid_=`cat ${thin_pid}` ps ax | grep ^${pid_} > /dev/null if [ $? -eq 0 ]; then echo "Thin instance for user ${user} is already running. Maybe try restart?" usage fi fi printf "Starting thin instance for user ${user}..." if [ -f ${thin_pid} ]; then rm -f ${thin_pid} fi cd ${sb_app_dir} sandbox-exec -f ${sb_profile} /usr/bin/thin --socket ${thin_sock} --rackup ${sb_app_root}/config.ru \ --environment production --timeout 4 --chdir ${sb_app_root} --log ${thin_log} --daemonize --pid ${thin_pid} \ --user ${thinuser} --group ${thingroup} --tag ${user} start cd - > /dev/null sleep 1 pid_=`cat ${thin_pid}` ps ax | grep ^${pid_} > /dev/null if [ $? -eq 0 ]; then echo "done" else echo "FAILED!" echo "Last 20 lines of logfile ${thin_log}:" tail -20 ${thin_log} exitcode=10 fi } stop_thin() { if [ -f ${thin_pid} ]; then pid_=`cat ${thin_pid}` ps ax | grep ^${pid_} > /dev/null if [ $? -ne 0 ]; then echo "Thin instance for ${user} user is already stopped or died. Maybe try start?" usage fi else echo "Pid file ${thin_pid} not found. Nothing to stop." usage fi printf "Stopping thin instance for user ${user}..." /usr/bin/thin --pid ${thin_pid} stop > /dev/null if [ $? -eq 0 ]; then echo "done" else echo "FAILED!" echo "Last 20 lines of logfile ${thin_log}:" tail -20 ${thin_log} exitcode=20 fi } if [ "${action}x" = "x" ]; then usage fi if [ ! -d ${sb_app_dir} ]; then echo "User's application directory ${sb_app_dir} doesn't exist. Exiting" usage elif [ ! -f ${sb_profile} ]; then echo "User's sandbox profile ${sb_profile} doesn't exist. Exiting" usage fi case ${action} in start) start_thin ;; stop) stop_thin ;; restart) stop_thin start_thin ;; *) usage ;; esac exit ${exitcode} 

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдПрдХ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЛ рд╕рд░реНрд╡рд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ: рд╣рдмрд░рд╛рдмреНрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдкреНрд░рд╢рд╛рд╕рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рд╕рдиреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдХрд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рднреА рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рджрд░реНрд╢рдХреЛрдВ рдХрд╛ рд░рд╡реИрдпрд╛ рдмрд╣реБрдд рд╕рдЦреНрдд рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╣реИрдмреЗ рдкрд░ рдореЗрд░реА рдкрд╣рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд╕реНрдЯ рд╣реИ - рдФрд░ рдореБрдЭреЗ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдРрд╕реЗ рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд▓рд┐рдЦреВрдВрдЧрд╛: рдПрдХ рдЬрд╛рдВрдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдПрдХ рдкреИрдЪ рдХреЗ рддрддреНрдХрд╛рд▓ рд╡реЗрдм рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯ рд╣реБрдХ рдФрд░ рд╢рд╛рд╣реА uWSGI рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛; рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ uWSGI рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рдПрдХ рднрд╛рд╖рд╛ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ; рд╕реВрдЪрдирд╛рддреНрдордХ DBMS рдХреА рд░рд╛рд╖реНрдЯреНрд░реАрдп рддреИрдирд╛рддреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In144663/


All Articles