> For the complete documentation index, see [llms.txt](https://derslik.kerteriz.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://derslik.kerteriz.net/nginx/nginx-kurulumu.md).

# ⚙️ Nginx Kurulumu

Nginx web sunucu yazılımının ne olduğunu ve nasıl çalıştığını öğrendikten sonra artık kurulum dersimize başlıyoruz. Bu dersimizde **Ubuntu 16.04** işletim sistemini kullanarak konuları işleyeceğiz.

## 1. İşletim Sisteminin Güncellenmesi

Kuruluma başlamadan önce işletim sistemini güncellememiz fayda sağlayacaktır.&#x20;

```bash
sudo apt update
sudo apt upgrade
```

## 2. Nginx Paketinin Kurulması

Nginx web sunucusunu artık indirerek yükleyebiliriz.

```bash
sudo apt install nginx
```

:pushpin: Herhangi bir sebeple nginx yüklemesini kaldırmak ve tekrar kurmak istediğinizde tüm konfigürasyonu ile birlikte nginx i kaldırmak için şu komutu çalıştırabilir ve ardından yukarıdaki kodla birlikte tekrardan yükleyebilirsiniz.

```bash
sudo apt purge nginx nginx-common nginx-full
```

## 3. Nginx Konfigürasyonunun Ayarlanması

*Hash bucket memory* problemini engellemek için ([Problem Nedir?](https://gist.github.com/muhammadghazali/6c2b8c80d5528e3118613746e0041263)) **`/etc/nginx`** dizini altında yer alan **`nginx.conf`** dosyasını **nano** veya **gedit** gibi editörlerle açarak `server_names_hash_bucket_size 64` satırının başındaki **#** işaretini siliniz.

{% code title="nginx.conf" %}

```bash
.
.
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
.
.
```

{% endcode %}

## 4. PHP-FPM Paketinin Kurulması

Sunucumuzda PHP dosyalarımızın yorumlanabilmesi için PHP-FPM paketimizi kurmalıyız. Bunun için aşağıdaki komutları çalıştırabilirsiniz.

```bash
sudo add-apt-repository ppa:ondrej/php
sudo apt-get install software-properties-common
sudo apt update
sudo apt-get install php7.3-fpm php7.3-cli php7.3-mysql phpunit
```

Paketleri kurduktan sonra **`/etc/php/7.3/fpm/`** dizini altında yer alan **`php.ini`** dosyamızdaki ilgili alanları düzenleyelim.

{% code title="php.ini" %}

```bash
file_uploads = On
allow_url_fopen = On
memory_limit = 256M
cgi.fix_pathinfo = 0
upload_max_filesize = 100M
max_execution_time = 360
date.timezone = Europe/Istanbul
```

{% endcode %}

Düzenlemelerimizin aktif olabilmesi için servisimizi yenileyelim.

```bash
sudo systemctl restart php7.3-fpm
```

Son olarak **`php -v`** komutu ile ekranda php versiyonunu görüyorsanız işlemimiz tamamdır.

## 5. Güvenlik Duvarını Ayarlama

İşletim sistemimizde güvenlik duvarımız etkinse Nginx web sunucusunun engellenmesini önlemek için Nginx i beyaz listeye eklemeliyiz.

Öncelikle güvenlik duvarı ile hangi uygulamaların kullanılabilir olduğunu görelim.

{% tabs %}
{% tab title="Komut" %}

```bash
sudo ufw app list
```

{% endtab %}

{% tab title="Çıktı" %}

```
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
```

{% endtab %}
{% endtabs %}

Komutun çıktısında gördüğünüz uygulamalar için güvenlik duvarına kural yazabiliriz. Öyleyse ilk kuralımızı yazalım.

```bash
sudo ufw allow 'Nginx HTTP'
```

HTTP üzerinden yani 80 portundan gelen trafiğe izin vererek Nginx in kısıtlanmadan kullanılmasını sağladık. Şimdi son durum kontrolünü yapalım.

{% tabs %}
{% tab title="Komut" %}

```bash
sudo ufw status
```

{% endtab %}

{% tab title="Çıktı" %}

```
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Eğer bu komut sonrası **`Status: inactive`** çıktısını görüyorsanız güvenlik duvarınız zaten kapalı demektir. Bu aşamadaki işlemleri yapmanıza gerek yoktur.
{% endhint %}

## 6. Web Sunucu Kontrolü

Nginx web sunucusunu ikinci adımda yüklemiştik. Şimdi web sunucu servisinin durumunu kontrol edelim.

```bash
systemctl status nginx
```

Nginx web sunucu servisinin durumunu kontrol ettiğimizde aktif olduğunu görmemiz gerekiyor.

```bash
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 Mon 2019-12-09 11:38:13 PST; 49min 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
```

Yukarıda ki çıktıda olduğu gibi **`Active: active (running)`** çıktısını gördüyseniz Nginx web sunucu yazılımı başarıyla çalışıyor demektir. Artık **`http://sunucu_ip_adresi`** veya **`localhost`** veya **`127.0.0.1`** adresleri üzerinden Nginx default sayfasına erişebilir ve aşağıdaki resimde olduğu gibi çıktıyı görebilirsiniz.

![Nginx default sayfası](/files/-LvgH0qLZFlNI_rJZ4_h)

{% hint style="info" %}
Nginx servisi üzerinde başlatma, durdurma, yeniden başlatma, konfigürasyonu yeniden yükleme işlemlerini yapabilmek için **`sudo systemctl xxx nginx`** komutundaki **xxx** yerine **`start`**, **`stop`**, **`restart`** ve **`reload`** terimlerini kullanabilirsiniz.
{% endhint %}

Artık Nginx web sunucumuzu başarıyla çalıştırdıktan sonra ilerleyen derslerimizde web sunucu uygulamalarımızı kurmaya başlayacağız.
