چگونه Nginx را بر روی اوبونتو 18.04 نصب کنید

مقدمه

Nginx یکی از محبوب‌ترین سرورهای وب در جهان است و مسئول میزبانی برخی از بزرگ‌ترین و بزرگ‌ترین سایت‌های انتقال ترافیک در اینترنت است. این روش نسبت به Apache در اکثر موارد نسبت به Apache بیشتر است و می‌تواند به عنوان یک سرور وب یا proxy معکوس مورد استفاده قرار گیرد.

در این راهنما، ما چگونگی نصب انجنیکس بر روی سرور ۱۸.۰۴ اوبونتو را توضیح خواهیم داد.

پیش نیازها

قبل از اینکه این راهنما را شروع کنید، باید موارد زیر را داشته باشید:

یک سرور ۱۸.۰۴ اوبونتو و یک کاربر معمولی و غیر root با امتیازات sudo. علاوه بر این، شما باید دیواره آتش پایه‌ای را برای مسدود کردن درگاه‌های غیر ضروری فراهم کنید. زمانی که یک حساب در دسترس دارید، وارد شدن به عنوان کاربر غیر root برای شروع.

مرحله ۱ – نصب Nginx

از آنجا که Nginx در مخازن پیش‌فرض Ubuntu’s موجود است، می‌توانید آن را با استفاده از سیستم بسته‌بندی مناسب نصب کنید. مخارن دیاکو وب نیز برای سیستم عامل Ubuntu فعال هستند می توانید از مخازن داخلی ما نیز استفاده کنید.

به روز رسانی شاخص بسته محلی خود:

				
					 sudo apt update

				
			

اقدام به نصب Nginx می کنید:

				
					 sudo apt install nginx
				
			
مرحله ۲ – تنظیم دیوارآتش اگر برنامه آموزشی پیش‌نیاز سرور را دنبال کنید، پس شما برسی می کنید وضعیت فعال بودن دیواره آتش ufw را با دستور:
				
					 sudo ufw app list

				
			

خروجی که باید مشاهده کنید:

				
					Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

				
			
آخرین کار که تنظیمات را ممکن را انجام دهیم که به ترافیک اجازه می‌دهد تا ترافیک را در پورت ۸۰ استفاده کند.
				
					sudo ufw allow 'Nginx HTTP'
				
			

مرحله ۳: بررسی وب سرور

برسی کنید با systemd init سیستم را تا مطمئن شوید که این سرویس فعال و کار می‌کند:

				
					 systemctl status nginx

nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-04-20 16:08:19 UTC;
 3 days ago
Docs: man:nginx(8)
Main PID: 2369 (nginx)
Tasks: 2 (limit: 1153)
CGroup: /system.slice/nginx.service
├─2369 nginx: master process /usr/sbin/nginx -g daemon on;
 master_process on;
└─2380 nginx: worker process 

				
			
دسترسی به صفحه پیش‌فرض Nginx برای تایید اینکه نرم‌افزار از طریق آدرس IP شما به درستی اجرا می‌شود:
				
					http://your_server_ip



				
			
شما باید صفحه پیش‌فرض Nginx را ببینید:

مرحله ۴ – چیدمان بلوک‌های سرور (Recommended)

یک دارکتوری ایجاد کنید برای example.com، با استفاده از پرچم  -p ایجاد کنید تا هر یک از شاخه‌های parent لازم را ایجاد کند:

				
					 sudo mkdir -p /var/www/example.com/html
				
			
تخصیص مالکیت شاخه:
				
					 sudo chown -R $USER:$USER /var/www/example.com/html
				
			
سطح دسترسی سطح وب سرور شما باید صحیح باشد و دسترسی root باشد، اما می‌توانید از تایپ کردن مطمئن شوید:
				
					sudo chmod -R 755 /var/www/example.com
				
			

یک صفحه index.html نمونه با استفاده از نانو یا ویرایشگر مورد علاقه خود تهیه کنید:

				
					 nano /var/www/example.com/html/index.html
				
			

در داخل، HTML نمونه زیر را اضافه کنید:

				
					<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1><span class="ez-toc-section" id="Success_The_examplecom_server_block_is_working"></span>Success!
  The example.com server block is working!<span class="ez-toc-section-end"></span></h1>
<script type="text/javascript" id="perfmatters-delayed-scripts-js">const pmDelayClick=false;const pmDelayTimer=setTimeout(pmTriggerDOMListener,10*1000);const pmUserInteractions=["keydown","mousedown","mousemove","wheel","touchmove","touchstart","touchend"],pmDelayedScripts={normal:[],defer:[],async:[]},jQueriesArray=[],pmInterceptedClicks=[];var pmDOMLoaded=!1,pmClickTarget="";function pmTriggerDOMListener(){"undefined"!=typeof pmDelayTimer&&clearTimeout(pmDelayTimer),pmUserInteractions.forEach(function(e){window.removeEventListener(e,pmTriggerDOMListener,{passive:!0})}),document.removeEventListener("visibilitychange",pmTriggerDOMListener),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",pmTriggerDelayedScripts):pmTriggerDelayedScripts()}async function pmTriggerDelayedScripts(){pmDelayEventListeners(),pmDelayJQueryReady(),pmProcessDocumentWrite(),pmSortDelayedScripts(),pmPreloadDelayedScripts(),await pmLoadDelayedScripts(pmDelayedScripts.normal),await pmLoadDelayedScripts(pmDelayedScripts.defer),await pmLoadDelayedScripts(pmDelayedScripts.async),await pmTriggerEventListeners(),document.querySelectorAll("link[data-pmdelayedstyle]").forEach(function(e){e.setAttribute("href",e.getAttribute("data-pmdelayedstyle"))}),window.dispatchEvent(new Event("perfmatters-allScriptsLoaded")),pmReplayClicks()}function pmDelayEventListeners(){let e={};function t(t,r){function n(r){return e[t].delayedEvents.indexOf(r)>=0?"perfmatters-"+r:r}e[t]||(e[t]={originalFunctions:{add:t.addEventListener,remove:t.removeEventListener},delayedEvents:[]},t.addEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.add.apply(t,arguments)},t.removeEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.remove.apply(t,arguments)}),e[t].delayedEvents.push(r)}function r(e,t){let r=e[t];Object.defineProperty(e,t,{get:r||function(){},set:function(r){e["perfmatters"+t]=r}})}t(document,"DOMContentLoaded"),t(window,"DOMContentLoaded"),t(window,"load"),t(window,"pageshow"),t(document,"readystatechange"),r(document,"onreadystatechange"),r(window,"onload"),r(window,"onpageshow")}function pmDelayJQueryReady(){let e=window.jQuery;Object.defineProperty(window,"jQuery",{get:()=>e,set(t){if(t&&t.fn&&!jQueriesArray.includes(t)){t.fn.ready=t.fn.init.prototype.ready=function(e){pmDOMLoaded?e.bind(document)(t):document.addEventListener("perfmatters-DOMContentLoaded",function(){e.bind(document)(t)})};let r=t.fn.on;t.fn.on=t.fn.init.prototype.on=function(){if(this[0]===window){function e(e){return e=(e=(e=e.split(" ")).map(function(e){return"load"===e||0===e.indexOf("load.")?"perfmatters-jquery-load":e})).join(" ")}"string"==typeof arguments[0]||arguments[0]instanceof String?arguments[0]=e(arguments[0]):"object"==typeof arguments[0]&&Object.keys(arguments[0]).forEach(function(t){delete Object.assign(arguments[0],{[e(t)]:arguments[0][t]})[t]})}return r.apply(this,arguments),this},jQueriesArray.push(t)}e=t}})}function pmProcessDocumentWrite(){let e=new Map;document.write=document.writeln=function(t){var r=document.currentScript,n=document.createRange();let a=e.get(r);void 0===a&&(a=r.nextSibling,e.set(r,a));var i=document.createDocumentFragment();n.setStart(i,0),i.appendChild(n.createContextualFragment(t)),r.parentElement.insertBefore(i,a)}}function pmSortDelayedScripts(){document.querySelectorAll("script[type=pmdelayedscript]").forEach(function(e){e.hasAttribute("src")?e.hasAttribute("defer")&&!1!==e.defer?pmDelayedScripts.defer.push(e):e.hasAttribute("async")&&!1!==e.async?pmDelayedScripts.async.push(e):pmDelayedScripts.normal.push(e):pmDelayedScripts.normal.push(e)})}function pmPreloadDelayedScripts(){var e=document.createDocumentFragment();[...pmDelayedScripts.normal,...pmDelayedScripts.defer,...pmDelayedScripts.async].forEach(function(t){var r=t.getAttribute("src");if(r){var n=document.createElement("link");n.href=r,n.rel="preload",n.as="script",e.appendChild(n)}}),document.head.appendChild(e)}async function pmLoadDelayedScripts(e){var t=e.shift();return t?(await pmReplaceScript(t),pmLoadDelayedScripts(e)):Promise.resolve()}async function pmReplaceScript(e){return await pmNextFrame(),new Promise(function(t){let r=document.createElement("script");[...e.attributes].forEach(function(e){let t=e.nodeName;"type"!==t&&("data-type"===t&&(t="type"),r.setAttribute(t,e.nodeValue))}),e.hasAttribute("src")?(r.addEventListener("load",t),r.addEventListener("error",t)):(r.text=e.text,t()),e.parentNode.replaceChild(r,e)})}async function pmTriggerEventListeners(){pmDOMLoaded=!0,await pmNextFrame(),document.dispatchEvent(new Event("perfmatters-DOMContentLoaded")),await pmNextFrame(),window.dispatchEvent(new Event("perfmatters-DOMContentLoaded")),await pmNextFrame(),document.dispatchEvent(new Event("perfmatters-readystatechange")),await pmNextFrame(),document.perfmattersonreadystatechange&&document.perfmattersonreadystatechange(),await pmNextFrame(),window.dispatchEvent(new Event("perfmatters-load")),await pmNextFrame(),window.perfmattersonload&&window.perfmattersonload(),await pmNextFrame(),jQueriesArray.forEach(function(e){e(window).trigger("perfmatters-jquery-load")});let e=new Event("perfmatters-pageshow");e.persisted=window.pmPersisted,window.dispatchEvent(e),await pmNextFrame(),window.perfmattersonpageshow&&window.perfmattersonpageshow({persisted:window.pmPersisted})}async function pmNextFrame(){return new Promise(function(e){requestAnimationFrame(e)})}function pmClickHandler(e){e.target.removeEventListener("click",pmClickHandler),pmRenameDOMAttribute(e.target,"pm-onclick","onclick"),pmInterceptedClicks.push(e),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}function pmReplayClicks(){window.removeEventListener("touchstart",pmTouchStartHandler,{passive:!0}),window.removeEventListener("mousedown",pmTouchStartHandler),pmInterceptedClicks.forEach(e=>{e.target.outerHTML===pmClickTarget&&e.target.dispatchEvent(new MouseEvent("click",{view:e.view,bubbles:!0,cancelable:!0}))})}function pmTouchStartHandler(e){"HTML"!==e.target.tagName&&(pmClickTarget||(pmClickTarget=e.target.outerHTML),window.addEventListener("touchend",pmTouchEndHandler),window.addEventListener("mouseup",pmTouchEndHandler),window.addEventListener("touchmove",pmTouchMoveHandler,{passive:!0}),window.addEventListener("mousemove",pmTouchMoveHandler),e.target.addEventListener("click",pmClickHandler),pmRenameDOMAttribute(e.target,"onclick","pm-onclick"))}function pmTouchMoveHandler(e){window.removeEventListener("touchend",pmTouchEndHandler),window.removeEventListener("mouseup",pmTouchEndHandler),window.removeEventListener("touchmove",pmTouchMoveHandler,{passive:!0}),window.removeEventListener("mousemove",pmTouchMoveHandler),e.target.removeEventListener("click",pmClickHandler),pmRenameDOMAttribute(e.target,"pm-onclick","onclick")}function pmTouchEndHandler(e){window.removeEventListener("touchend",pmTouchEndHandler),window.removeEventListener("mouseup",pmTouchEndHandler),window.removeEventListener("touchmove",pmTouchMoveHandler,{passive:!0}),window.removeEventListener("mousemove",pmTouchMoveHandler)}function pmRenameDOMAttribute(e,t,r){e.hasAttribute&&e.hasAttribute(t)&&(event.target.setAttribute(r,event.target.getAttribute(t)),event.target.removeAttribute(t))}window.addEventListener("pageshow",e=>{window.pmPersisted=e.persisted}),pmUserInteractions.forEach(function(e){window.addEventListener(e,pmTriggerDOMListener,{passive:!0})}),pmDelayClick&&(window.addEventListener("touchstart",pmTouchStartHandler,{passive:!0}),window.addEventListener("mousedown",pmTouchStartHandler)),document.addEventListener("visibilitychange",pmTriggerDOMListener);var pmeDeviceMode,pmeAnimationSettingsKeys,pmeCurrentAnimation;function pmeAnimation(){(pmeDeviceMode=document.createElement("span")).id="elementor-device-mode",pmeDeviceMode.setAttribute("class","elementor-screen-only"),document.body.appendChild(pmeDeviceMode),requestAnimationFrame(pmeDetectAnimations)}function pmeDetectAnimations(){pmeAnimationSettingsKeys=pmeListAnimationSettingsKeys(getComputedStyle(pmeDeviceMode,":after").content.replace(/"/g,"")),document.querySelectorAll(".elementor-invisible[data-settings]").forEach(a=>{let b=a.getBoundingClientRect();if(b.bottom>=0&&b.top<=window.innerHeight)try{pmeAnimateElement(a)}catch(c){}})}function pmeAnimateElement(a){let b=JSON.parse(a.dataset.settings),d=b._animation_delay||b.animation_delay||0,c=b[pmeAnimationSettingsKeys.find(a=>b[a])];if("none"===c)return void a.classList.remove("elementor-invisible");a.classList.remove(c),pmeCurrentAnimation&&a.classList.remove(pmeCurrentAnimation),pmeCurrentAnimation=c;let e=setTimeout(()=>{a.classList.remove("elementor-invisible"),a.classList.add("animated",c),pmeRemoveAnimationSettings(a,b)},d);window.addEventListener("perfmatters-startLoading",function(){clearTimeout(e)})}function pmeListAnimationSettingsKeys(b="mobile"){let a=[""];switch(b){case"mobile":a.unshift("_mobile");case"tablet":a.unshift("_tablet");case"desktop":a.unshift("_desktop")}let c=[];return["animation","_animation"].forEach(b=>{a.forEach(a=>{c.push(b+a)})}),c}function pmeRemoveAnimationSettings(a,b){pmeListAnimationSettingsKeys().forEach(a=>delete b[a]),a.dataset.settings=JSON.stringify(b)}document.addEventListener("DOMContentLoaded",pmeAnimation)</script></body>
</html>

				
			

ذخیره کنید و ببندید فایل را کار شما تمام شده است.

ایجاد یک بلوک سرور جدید در برای هاست های فعال می باشد در مسیر 

etc / nginx / sites / available

				
					sudo nano /etc/nginx/sites-available/example.com
				
			

چسباندن در لاین پیکره بندی زیر، برای شاخه جدید و نام دامنه خود به روز می‌شود:

				
					server {
         listen 80;
         listen [::]:80;
     root /var/www/example.com/html;     index index.html index.htm index.nginx-debian.html;     server_name example.com www.example.com;     location / {             try_files $uri $uri/ =404;     }
 }

				
			

ذخیره کنید و ببندید فایل را کار شما تمام شده است.

به کار انداختن پرونده با ایجاد یک لینک از آن به دایرکتوری sites-enabled به کار انداخته شده:

				
					 sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
				
			

دو بلوک سرور اکنون به کار انداخته شده و برای پاسخ به درخواست‌های مبتنی بر دستورها و دستورها سرویس دهنده استفاده شده‌است:

example.com: ویل به درخواست for و www.example.com پاسخ می‌دهد.

پیش‌فرض: ویل به هر درخواستی در بندر ۸۰ که با دو بلوک دیگر مطابقت ندارد، پاسخ می‌دهد.

برای جلوگیری از یک مساله حافظه که ممکن است ناشی از اضافه کردن نام کارگزاری اضافی باشد، لازم است که یک مقدار واحد در پرونده  etc/nginx/nginx.conf تنظیم شود.

برای جلوگیری از یک مساله حافظه که ممکن است ناشی از اضافه کردن نام کارگزاری اضافی باشد، لازم است که یک مقدار واحد در پرونده etc/nginx/nginx.conf تنظیم شود.

				
					 sudo nano /etc/nginx/nginx.conf
				
			

تست کردن خطاهای نحوه عملکرد دستورات تا اکنون :

				
					sudo nginx -t
				
			

اگر مشکلی بود راه‌اندازی مجدد Nginx برای فعال کردن تغییرات روی کل سرور

				
					 sudo systemctl restart nginx
				
			

Nginx باید به نام دامنه شما خدمت کند. و با زدن نام دامنه در مرورگر این صفحه مشاهده کنید:

حالا که وب سرور خود را نصب کرده‌اید، گزینه‌های زیادی برای نوع محتوا برای خدمت و فناوری‌هایی که می‌خواهید برای ایجاد تجربه غنی‌تر از آن استفاده کنید، دارید. می توانید از سرور مجازی و یا سرور اختصاصی دیاکو وب بسته به نیاز خودتان که چه میزان منابع نیاز دارید و یک سرویس مطابقه تجارتتان انتخاب کنید و شروع کنید ما در کنار شما هستیم در پشتیبانی.