<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nginx.conf | リューブログ</title>
	<atom:link href="https://ryuusan.com/tag/nginx-conf/feed/" rel="self" type="application/rss+xml" />
	<link>https://ryuusan.com</link>
	<description>就活生だった時の気づきや日常の発信のほか、技術ブログとしても運用しています。</description>
	<lastBuildDate>Mon, 05 Oct 2020 07:39:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://ryuusan.com/wp-content/uploads/2020/03/cropped-logo-32x32.png</url>
	<title>Nginx.conf | リューブログ</title>
	<link>https://ryuusan.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Nginxの設定ファイルまとめ</title>
		<link>https://ryuusan.com/nginxconf/</link>
					<comments>https://ryuusan.com/nginxconf/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Sun, 26 Jul 2020 13:09:08 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Nginx.conf]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=309</guid>

					<description><![CDATA[勉強中ですが学んだことをまとめていきます。 目次 設定コンテキストについてリバースプロキシリバースプロキシの際、パスが通らなくなる問題 設定コンテキストについて Nginxの設定ファイルは、以下のようにいくつかのコンテキ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">勉強中ですが学んだことをまとめていきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">設定コンテキストについて</a></li><li><a href="#toc2" tabindex="0">リバースプロキシ</a></li><li><a href="#toc3" tabindex="0">リバースプロキシの際、パスが通らなくなる問題</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">設定コンテキストについて</span></h2>



<p class="wp-block-paragraph">Nginxの設定ファイルは、以下のようにいくつかのコンテキスト(要素)によって構成されます。</p>



<figure class="wp-block-table"><table><tbody><tr><td><span class="bold">コンテキスト名</span></td><td class="has-text-align-left" data-align="left"><span class="bold">説明</span></td></tr><tr><td>コアコンテキスト</td><td class="has-text-align-left" data-align="left">Nginx自体が使用するコンテキスト。触れる必要はなさそう。</td></tr><tr><td>メインコンテキスト</td><td class="has-text-align-left" data-align="left">コンテキストブロックに含まれない。基本レベルの設定を記述する。</td></tr><tr><td>イベントコンテキスト</td><td class="has-text-align-left" data-align="left">1つだけ定義できる。グローバルオプションを設定を記述する。</td></tr><tr><td>HTTPコンテキスト</td><td class="has-text-align-left" data-align="left">NginxをWebサーバやリバースプロキシとして利用する際に記述。</td></tr><tr><td>サーバコンテキスト</td><td class="has-text-align-left" data-align="left">HTTPコンテキストの子。仮想サーバを定義するために複数宣言も可能。</td></tr><tr><td>ロケーションコンテキスト</td><td class="has-text-align-left" data-align="left">URI内のパスに対しての設定を記述する。</td></tr></tbody></table><figcaption>表1. 各コンテキストの説明</figcaption></figure>



<p class="wp-block-paragraph">このように、それぞれのコンテキストを正しく設定することでNginxが思い通りの処理をしてくれるようになります。</p>



<h2 class="wp-block-heading"><span id="toc2">リバースプロキシ</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-18px">リバースプロキシの設定をする</span></span></p>
</div>



<p class="wp-block-paragraph">リバースプロキシサーバは、Webサーバと利用者の間に置かれ、それぞれの通信を中継するために使われます。今回の僕の目的は、このリバースプロキシサーバを用いてプライベートサーバ上のDockerで動いているアプリケーションを公開することです。</p>



<p class="wp-block-paragraph">また、リバースプロキシを使うことでセキュリティ向上や負荷分散などが可能になり、メリットもとても大きいです。以下はリバースプロキシを使用するための設定ファイルです。 <span class="bold">/etc/nginx/conf.d</span>に以下のような設定ファイルを置きます。</p>



<pre class="wp-block-code"><code>server {
    listen 80;
    server_name "サーバ名";
    proxy_set_header Host $http_host;
    location /{
        proxy_pass "中継したいURL"
    }
}</code></pre>



<p class="wp-block-paragraph">ちなみに、中継したいURLの最後にスラッシュをつけるかどうかで動作が変わってくるので注意してください。その後、Nginxを再起動させて変更した設定ファイルを読み込ませます。</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<p class="wp-block-paragraph">最低限の設定ファイルはこのようになります。さらに、ここからSSL設定等を追記していきます。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-18px">ユーザのIPアドレスを記録するようにする</span></span></p>
</div>



<p class="wp-block-paragraph">リバースプロキシを行う場合、Webサーバ側にはユーザからのアクセスが全てリバースプロキシからのアクセスとなってしまい、ユーザのIPアドレスなどを確認することができなくなってしまいます。そこで、以下のような設定を行うことでユーザの<span class="bold">痕跡</span>を残すことができるようにします。</p>



<pre class="wp-block-code"><code>server {
    listen 80 default_server;
    server_name "サーバ名";
    
    proxy_redirect   off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass "中継したいURL";
    }
}</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-18px">HTTPSにも対応させる</span></span></p>
</div>



<p class="wp-block-paragraph">以下のように設定したファイルを<span class="bold">conf.d</span>ディレクトリ下に新しく置きます。</p>



<pre class="wp-block-code"><code>server {
    listen 443 ssl http2 default_server;
    server_name "サーバ名";

    ssl_certificate "/etc/letsencrypt/live/"Domain"/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/"Domain"/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;
    
    proxy_redirect   off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass "中継したいURL";
    }
}</code></pre>



<p class="wp-block-paragraph">これでHTTPSにも対応ができました。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>websocketをリバースプロキシ</strong></p>
</div>



<p class="wp-block-paragraph">websocketをリバースプロキシする際はlocationにwsを設定し、その中に以下のように記述しましょう。</p>



<pre class="wp-block-code"><code>location /ws/ {
	proxy_http_version 1.1; #デフォルトはHTTP 1.0
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_pass "中継したいURL"
}</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>アクセスされたURLに応じて振り分け</strong></p>
</div>



<p class="wp-block-paragraph">例えば、<strong>https://aaa.com</strong>にアクセスされた場合はhttp://bbb.comに、<strong>https://aaa.com/hello/world</strong>にアクセスされた場合はhttp://ccc.com/hello/worldに振り分けたい場合もあるかもしれません。そんな時は以下のように設定しましょう。</p>



<pre class="wp-block-code"><code>location / {
    proxy_pass http://bbb.com/;
}

location /hello/ {
    proxy_pass http://ccc.com;
} </code></pre>



<h2 class="wp-block-heading"><span id="toc3">リバースプロキシの際、パスが通らなくなる問題</span></h2>



<p class="wp-block-paragraph">例えば、<strong>http://hogehoge.com/subdir</strong>というURLにアクセスすることで、プライベートサーバーで稼働しているDjangoアプリ(<strong>http://123.45.678.90:9000</strong>)にリバースプロキシするように設定したとします。</p>



<p class="wp-block-paragraph">この設定の場合、例えば<strong>http://hogehoge.com/subdir/toppage</strong>にアクセスした場合、Djangoアプリのトップページ(<strong>http://123.45.678.90:9000/toppage</strong>)にアクセスすることができます。</p>



<p class="wp-block-paragraph">Djangoアプリの方ではトップページから<strong>http://123.45.678.90:9000/aaa</strong>にリンクを張っているのですが、リバースプロキシを行っているので、そのリンクが期待されるURLである<strong>http://hogehoge.com/subdir/aaa</strong>ではなく、<strong>http://hogehoge.com/aaa</strong>のようになってしまいます。これでは404エラーを吐いてしまい、正しいリンク先にアクセスできません。</p>



<p class="wp-block-paragraph">そこで僕が行ったのは、Djangoアプリ側の設定を変更して以下のように常に<strong>subdir/</strong>を挿入するようにしたことでした。</p>



<pre class="wp-block-code"><code>urlpatterns = &#91;
    path('subdir/admin/', admin.site.urls),
    path('subdir/', include('hoge.urls')),
]</code></pre>



<p class="wp-block-paragraph">DjangoのURL設定は階層構造のようになっているのでこのような手が取れましたが、本来であればWebサーバー等で解決すべき問題なのかもしれません。ちなみに、railsの場合はサブディレクトリにデプロイする用の設定ができるらしく、Djangoにも同様の設定がないか探しましたが見つけられませんでした。</p>



<p class="wp-block-paragraph">Webアプリではなくホームページなど静的ファイルの場合は相対パスで行けると思います。</p>



<p class="wp-block-paragraph">もしより良い方法を知っている方がいらっしゃいましたらtwitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)で教えてくださると助かります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/nginxconf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
