<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های alma pourhosseni</title>
        <link>https://virgool.io/feed/@alma_pourhosseini</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 07:59:56</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/134263/avatar/Fzn06P.jpeg?height=120&amp;width=120</url>
            <title>alma pourhosseni</title>
            <link>https://virgool.io/@alma_pourhosseini</link>
        </image>

                    <item>
                <title>Docker techniques</title>
                <link>https://virgool.io/@alma_pourhosseini/docker-techniques-xuprxyjpfelv</link>
                <description>1.Open your Docker daemon to the world می دانیم که docker deamon فقط روی ‌host قابل دسترسه. اما گاهی به دلایلی مثل دیباگ یا انجام کاری لازم باشه به صورت ریموت افراد دیگه دسترسی داشته باشند. پس در این جا با وجود این که امنیت زیر سوال میره میتونیم اجازه دسترسی به  docker daemon رو به افراد باید بدیم.کانفیگ پیش فرض داکر به این صورت که دسترسی ها ازطریق سوکت دامنه /var/run/docker.sock/ محدود شده و فرایند های خارجی بهش دسترسی ندارند.ایجاد دسترسی به docker daemon از طریق سوکت TCP 2375 انجام می دهیم و برای وصل شدن از IP و پورت 2375  استفاده می شود.خب برای ایجاد دسترسی باید  docker را stop  کنیمSystemctl stop docker.service و سپس دستور زیر را میزنیم dockerd -H tcp://0.0.0.0:2375 در حقیقت docker daemon را start  می کنیم.و برای وصل شدن به آن از دستور زیر استفاده می کنیم.docker -H tcp://&lt;your host&#039;s ip&gt;:23752.Managing the startup of your container’s servicesهمانطور که میدانیم کانتینر های docker هر کدام برای بالا اوردن یک سرویس هستند . اما زمانی هست که میخواهیم چندین سرویس را داخل کانتینر داشته باشیم برای همین میتونیم از  supervisor و وب سرویس های apache2 و tomcat استفاده کنیم.خب ابتدا باید image مربوط به supervisor را بسازیم.پس با استفاده از Dockerfile  زیر  image را می سازیم.FROM ubuntu:14.04RUN apt-get update &amp;&amp; apt-get install -y python-pip apache2 tomcat7ENV DEBIAN_FRONTEND noninteractiveRUN pip install supervisorRUN mkdir -p /var/lock/apache2RUN mkdir -p /var/run/apache2RUN mkdir -p /var/log/tomcatRUN echo_supervisord_conf &gt; /etc/supervisord.confADD ./supervisord_add.conf  /tmp/supervisord_add.confRUN cat /tmp/supervisord_add.conf &gt;&gt; /etc/supervisord.confRUN rm /tmp/supervisord_add.confCMD [&amp;quotsupervisord&amp;quot,&amp;quot-c&amp;quot,&amp;quot/etc/supervisord.conf&amp;quot]حالا باید supervisor  را کانفیگ کنیم و مشخص کنیم چه سرویس هایی باید بالا بیان روی کانتینر[supervisord]nodaemon=true# apache[program:apache2]command=/bin/bash -c &amp;quotsource /etc/apache2/envvars &amp;&amp; exec /usr/sbin/apache2 -DFOREGROUND&amp;quot# tomcat[program:tomcat]command=service start tomcatredirect_stderr=truestdout_logfile=/var/log/tomcat/supervisor.logstderr_logfile=/var/log/tomcat/supervisor.error_log[supervisord]nodaemon=true این قسمت برای کانفیگ کلی supervisor می باشد# apache[program:apache2]# tomcat[program:tomcat]در این قسمت سرویس هایی که میخواهیم اجرا بشوند را قرار می دهیمبا دستور زیر image را می سازیمdocker build -t supervised .و سپس اجرا می کنیمdocker run -p 9000:80 --name supervised supervised3.The “save game” approach to develop  زمانی پیش میاد که داخل کانتینر تغییراتی اعمال کردیم مثل تغییر محتوای داخل یک فایل یا ساخت یک فایل و میخواهیم این تغییرات رو save نگه داریم .راه حلی که براش وجود داره اینه که بعد از اعمال تغییرات کامیتشون کنیم. طبق توضیحات پایین می تونیم این کارو انجام بدیم:docker  run --rm -d -p 8000:8000 --name todoapp dockerinpractice/todoappdocker exec -it todoapp bashسپس یک editor  نصب میکنیمapt-get updateapt install vimو یک فایل ایجاد می کنیمvim text.htmlو tag زیر را داخلش قرار میدم&lt;title&gt;this is test&lt;/title&gt;حالا با دستور زیر کامیت میکنمdocker commit todoapp8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672حالا داخل یک ترمینال دیگر دستور زیر را اجرا می کنیمdocker run -p 8001:8000 8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672نکته: با commit  کردن فقط وضعیت فایل سیستم را ذخیره می کنیم و فرایند ها ذخیره نمی شوند.4.Docker taggingزمانی یک  image ایجاد می کنیم یک id به ما میده که طولانیه و سخته همیشه بخوایم باهاش کار کنیم یا حفظش کنیم بخاطر همین بهتره برای  image هامون tag بزاریم با استفاده از دستور زیر:docker tag 8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672  todoapp و از این به بعد بخوایم با image کار کنیم می تونیم با tag صداش بزنیم.             5.Sharing images on the Docker Hubبرای ذخیره کردن image ها باید از یک رجیستری استفاده کنیم .می تونیم از رجیستری public مثل docker hub استفاده کنیم یا از یک رجیستری peivate که خودمون راه اندازی کردیم.برای استفاده از ‌رجیستری  docker hub یا رجیستری private باید ابتدا login  کنیمdocker login -u username -p password registry_urlبه طور مثال ما یک image داریم و میخوایم بفرستیم به رجیستری  public باید به صورت زیر عمل کنیمdocker tag username/imagename  imagenamedocker push username/imagenameارسال image به رجیستری privatedocker tag registry_url/imagename  imagenamedocker push registry_url/imagenamem                    برای pull کردن image از رجیستری private باید از دستور زیر استفاده کنیدdocker  pull registry_url/imagename   وقتی داخل dockerhub یک image  قرار می دهید این image  در ریپازیتوری شما قرار می گیرد و افرادی که به این ریپازیتوری دسترسی داشته باشند می توانند از آن استفاده کنند.                                               6.onbuild and galangیک زمانی ما دو تا داکر فایل با دو اسم متفاوت داریم اما می خواهیم تعداد کامند هایی که هر کدام اجرا می کنن رو کم کنیم و یکسری کامند رو فقط زمان های خاصی اجرا کنیم. در اینجا می تونیم از ONBUILD استفاده کنیم.به این صورت که ما یک داکرفایل base داریم به شکل زیر:FROM maven:3-jdk-8RUN mkdir -p /usr/src/appWORKDIR /usr/src/appONBUILD ADD . /usr/src/appONBUILD RUN mvn install و داکرفایل به شکل زیر است:FROM maven:3.3-jdk-8-onbuildCMD [ “java”,”-jar”,”/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar”]که زمان اجرا داکرفایل چون maven:3.3-jdk-8-onbuild را در FROM گزاشتیم ابتدا ONBUILD ها رو اجرا می کنه بعد CMD7.Cleanly killing containersزمانی که می خواهید به container خاتمه دهید دو راه وجود دارد:docker stopdocker killCommand                            Default signal                     Default signal value      kill                                           TERM                                        15docker kill                                    KILL                                           9docker stop                                 TERM                                        15که در ادامه تفاوت این دو را توضیح میدم.docker stop:زمانی که از docker stop استفاده می کنیم ابتدا سیگنال TERM رو ارسال می کنه و به مدت 10 ثانیه صبر می کنه و بعد سیگنال KILL  رو می فرسته یعنی به container این فرصت رو میده که خاتمه پیدا کنه.    docker kill:زمانی که از docker kill استفاده می کنیم مستقیما سیگنال KILL رو ارسال می کنه و فرصتی به container  داده نمی شود برای خاتمه پیدا کردن و ممکنه فایل های مربوط به اجرای  پروسس در سیستم باقی بمانند.در کل بهتره که برای خاتمه دادن به container  ها از docker stop  استفاده بشه.             8.Retaining your container’s bash history                    یه وقتایی پیش میاد میخوایم history مربوط به  bash کانتینر رو به host انتقال بدیم .برای این کار می توانیم از فلگ e- موقع run کردن container  استفاده کنیمdocker run -e HIST_FILE=/root/.bash_history \-v=$HOME/.bash_history:/root/.bash_history \-ti ubuntu /bin/bash9.Data containersما به طور مثال 4 container  داریم که 3 از آن ها از یک فایل یکسان container چهارم استفاده می کنن .به طور مثال ما یک container  برای ubuntu بالا اوردیم و داخل آن یک فایل ایجاد کردیم حالا می خوایم بدون این که این فایل mount  بشه روی هاست mount کنیم روی سه container  دیگهابتدا یک کانتینر با اسم dc میاریم بالا و یک فولدر به اسم shared-data می سازیم که فقط روی کانتینر هست و mount  نشده به هاستdocker run -v /shared-data --name dc busyboxسپس داخل فولدر یک فایل می سازیمtouch /shared-data/somefileحالا می خوایم سه کانتینر ubuntu دیگه بالا بیاریم که هر سه بتونن این فایل رو ببینن. که برای این کار باید از volumes-from-- استفاده کنیمباید هر سه کانتینر دیگر رو با کامند زیر ایجاد کنیمdocker run -t -i --volumes-from dc ubuntu /bin/bashاگر داخل کانتینر دستور زیر را بزنید باید somefile رو ببینیدls /shared-data10. Inspecting containersبرای اطلاعات جزئی تر از container مثل ip و … میتوانیم از دستور زیر استفاده کنیمdocker inspect ubuntu با زدن این دستور یه فایل json  مشاهده می کنین از اطلاعات  contaiener که داخل .NetworkSettings میتوانیم ip کانتینر رو ببینیمحتی موقع inspect  گرفتن می توانین تعیین کنین فرمت روdocker inspect \--format &#039;{{.NetworkSettings.IPAddress}}&#039; \ubuntu                                                                                                                                                                                               </description>
                <category>alma pourhosseni</category>
                <author>alma pourhosseni</author>
                <pubDate>Wed, 28 Jul 2021 11:55:31 +0430</pubDate>
            </item>
                    <item>
                <title>راه اندازی پروژه php  با استفاده از فریمورک Yii2</title>
                <link>https://virgool.io/@alma_pourhosseini/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-php-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-yii2-tgn7lmliqogs</link>
                <description>فریمورک Yii   یکی از فریمورک های PHP است که   open source می باشد و برای ساخت برنامه های کاربردی وب مورد استفاده قرار می گیرد. فریمورک Yii براساس الگوی طراحی Model-View-Controller ساخته شده است که ویژگی های امن و حرفه ای را برای ایجاد سریع پروژه های قوی فراهم می کند.ابتدا باید وب سرور nginx  را نصب کنید.sudo apt updatesudo apt install سپس باید php نصب کنید.sudo apt install php-fpm php-mysql
sudo apt install curl php-cli php-mbstring git unzipو همچنین از داخل لینک مشخص شده composer  را نیز نصب کنید.حال در مسیری که پروژه شما قرار دارد بروید .(بهتره پروژه در مسیر /var/www/ قرار داشته باشد)cd /var/www/your-project-nameو سپس با دستور زیر می توانید پروژه را ایجاد کنید.composer create-project --prefer-dist yiisoft/your-project-name basic دقت کنید که داخل کانفیگ مربوط به nginx  در مسیر زیر:vi /etc/nginx/site-available/your-domain- name مسیری که قرار است پروژه از روی آن خوانده شود را درست قرار دهید.root /var/www/basicحال با وارد کردن آدرس زیر در مرورگر می توانید نتیجه را ببینید.http://localhost/basic/web/</description>
                <category>alma pourhosseni</category>
                <author>alma pourhosseni</author>
                <pubDate>Fri, 28 Aug 2020 16:16:53 +0430</pubDate>
            </item>
                    <item>
                <title>Pagespeed on ubuntu</title>
                <link>https://virgool.io/@alma_pourhosseini/pagespeed-on-ubuntu-msdcphf7gogb</link>
                <description>با استفاده از pagespeed  می توان سرعت load  صفحات وب را افزایش داد.ابتدا باید وب سرور  nginx  را روی  ubuntu  نصب کنید.sudo apt update &amp;&amp; sudo apt install nginxو بعد وضعیت nginx  را چک کنید که در حالت active باشد.sudo systemctl status nginxحالا google pagespeed  و ماژول های مورد نیاز را نصب  کنید.sudo apt install libssl-dev
bash &lt;(curl -f -L -sS https://ngxpagespeed.com/install) \
--nginx-version latestبرای نصب ماژول ها دستور زیر را بزنید--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_moduleو سپس برای build nginx و configuration  سوال میپرسه که می تونید y  بزنیدمرحله بعد Configure Systemd for NGINX Controlsudo nano /lib/systemd/system/nginx.serviceو دستورات زیر را به جای دستورات موجود قرار دهید[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.targetمرحله بعد ایجاد دایرکتوری cache و ایجاد دسترسیmkdir -p /var/cache/nginx/client_temp
mkdir /var/cache/ngx_pagespeed/
chown nginx:nginx /var/cache/ngx_pagespeed/در متغیر (whoami)$ اطلاعات کاربری که در حال حاضر وارد شدید رادر خود ذخیره می کندsudo chown -R $(whoami):$(whoami) /var/www/html/سپس دسترسی بهdirectory  را ایجاد کنیدsudo chmod -R 755 /var/wwwمرحله بعد باید  server block  را در config  مربوط به  default  تغییر بدهیدsudo nano /etc/nginx/sites-available/defaultو دستورات زیر با تغییر نام دامنه به نام دامنه خود قرار دهیدserver {
        listen 80 default_server;
        listen [::]:80 default_server;

        # include snippets/snakeoil.conf;
        root /var/www/html;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name your-domain-name;
        
        access_log   logs/your-domain-name.access.log;
        error_log    logs/your-domain-name.error error;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
        
        pagespeed on;
        pagespeed FileCachePath &amp;quot/var/cache/ngx_pagespeed/&amp;quot
        pagespeed RewriteLevel OptimizeForBandwidth;

        location ~ &amp;quot\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+&amp;quot {
           add_header &amp;quot&amp;quot &amp;quot&amp;quot
        }

        location ~ &amp;quot^/pagespeed_static/&amp;quot { }
        location ~ &amp;quot^/ngx_pagespeed_beacon$&amp;quot { }

}و داخل  index.html  میتوانید عبارت زیر را قرار بدهید که هنگام  load  صفحه آن را به شما نمایش دهدsudo echo &amp;quotThanks Axfon.com for Google PageSpeed Configuration&amp;quot &gt; /var/www/html/index.htmlو در نهایت درستی  nginx را  تست کنیدnginx -tامکان دارد با خطایی مواجه شوید مانند:nginx: [emerg] dlopen() &quot;/etc/nginx/modules/ngx_http_geoip_module.so&quot; failed (/etc/nginx/modules/ngx_http_geoip_module.so: cannot open shared object file: No such file or directory) in /etc/nginx/modules-enabled/50-mod-http geoip.conf:1که باید در مسیر زیر عبارت include  مشخص شده را کامنت  کنید.sudo nano /etc/nginx/nginx.confuser www-data;
worker_processes auto;
pid /run/nginx.pid;
#include /etc/nginx/modules-enabled/*.conf;
events {
        worker_connections 768;
        # multi_accept on;
}سپس nginx  را  restart  می کنیم.sudo service nginx restartو در نهایت با دستور زیر نتیجه را تست می کنیم که در صورت درست بودن عبارت X-Page-Speed را مشاهده می کنیدcurl -I -X GET your-domain-nameو اگر نام domain  خود را در مرورگر خود تایپ کنید عبارتی که در  index.html  قرار دادید را نشان می دهد</description>
                <category>alma pourhosseni</category>
                <author>alma pourhosseni</author>
                <pubDate>Thu, 27 Aug 2020 13:43:44 +0430</pubDate>
            </item>
                    <item>
                <title>Rsync</title>
                <link>https://virgool.io/cheyab-blog/rsync-woncdkexhksj</link>
                <description>برای انتقال فایل ها و پوشه ها از یک سرور محلی به سرور ریموت  و یا از سرور ریموت به سرور محلی  و همچنین در یک سرور محلی از آدرسی به آدرس دیگر می توان از Rsync استفاده کرد.1.برای انتقال فایل  ها در یک سرور محلی از آدرسی به آدرس دیگرrsync  /root/filename /tmp/backups/همچنین برای انتقال پوشه در همه حالات می توان از a-  استفاده کرد .2.برای انتقال فایل  ها از سرور محلی به سرور ریموتrsync /root/filename user@ip_server_remot:/tmp/backups/در اینجا امکان دارد با خطای عدم اجازه دسترسی به مسیر مشخص شده در سرور ریموت مواجه شوید که باید در سرور ریموت با دستور chown اجازه دسترسی به user  سرور محلی داده شود.3.برای انتقال فایل ها از سرور ریموت به سرور محلیrsync user@ip_server_remot:/tmp/backups/ /root/filename</description>
                <category>alma pourhosseni</category>
                <author>alma pourhosseni</author>
                <pubDate>Fri, 21 Aug 2020 15:05:32 +0430</pubDate>
            </item>
                    <item>
                <title>Install &amp; configuration php on ubuntu 18.04</title>
                <link>https://virgool.io/@alma_pourhosseini/install-configuration-php-on-ubuntu-1804-nhv1sm5lj5yb</link>
                <description>install php1.ابتدا باید وب سرور nginx  رو نصب کنیم.sudo apt update
sudo apt install nginx2.سپس پیشنیاز های php  را نصب می کنیم.sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php3.حال می توانیم پکیج های مربوط به  php  را نصب کنیم.sudo apt update
sudo apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip unzip -yphp configurationبرای چک کردن و همچنین تغییر user  داخل php  از طریق www.conf که در مسیر زیر قرار دارد انجام می شود./etc/php/7.4/fpm/pool.d/www.confیکی از افزونه های php  که باعث افزایش سرعت load  می شود opcache  می باشد .به این صورت که کد compile  شده را داخل cache  نگه داری میکند و نیاز به بارگزاری مجدد نیست./etc/php/7.4/fpm/php.iniبا استفاده از max_execution_time حداکثر زمانی که یک script  می تواند اجرا شود مشخص می کنیم./etc/php/7.4/fpm/php.iniبرای تنظیم حافظه سرور ابری می توان با استفاده از pm.max_children تنظیمات مورد نیاز را انجام داد .pm.max_children= php-fpm میزان حافظه سرور ابری مورد استفاده  / process متوسط اندازهو سپس در مسیر زیر می توان تنظیمات را اعمال کرد/etc/php/7.4/fpm/pool.d/www.confدر آخر هم برای اعمال تغییرات داده شده سرویس php-fpm  را restart  می کنیم.systemctl restart php7.4-fpm.service</description>
                <category>alma pourhosseni</category>
                <author>alma pourhosseni</author>
                <pubDate>Thu, 20 Aug 2020 16:07:30 +0430</pubDate>
            </item>
            </channel>
</rss>