{"id":2023,"date":"2018-12-02T17:46:10","date_gmt":"2018-12-02T08:46:10","guid":{"rendered":"http:\/\/www.python.ambitious-engineer.com\/?p=2023"},"modified":"2018-12-02T17:46:10","modified_gmt":"2018-12-02T08:46:10","slug":"uwsgi%e3%82%92centos-7%e4%b8%8a%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%99","status":"publish","type":"post","link":"https:\/\/www.python.ambitious-engineer.com\/archives\/2023","title":{"rendered":"uWSGI\u3092Centos 7\u4e0a\u3067\u52d5\u304b\u3059"},"content":{"rendered":"<p><a href=\"http:\/\/www.python.ambitious-engineer.com\/archives\/1959\">\u524d\u56de<\/a>\u306e\u7d9a\u304d\u3067\u3001\u4eca\u56de\u306fPython\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u3001uWSGI\u3092Centos7\u3067\u52d5\u304b\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>Linux\u306e\u5165\u9580\u77e5\u8b58\u304c\u4e0d\u5b89\u306a\u65b9\u306f\u3001\u4ee5\u4e0b\u306b\u307e\u3068\u3081\u3066\u3044\u307e\u3059\u306e\u3067\u9069\u5b9c\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<br \/>\n<a target=\"_blank\" href=\"https:\/\/www.linux.ambitious-engineer.com\/?page_id=500\">Linux\u5b66\u7fd2\u8b1b\u5ea7 \u8d85\u5165\u9580\u7de8<\/a><\/p>\n<h2>\u6982\u8981<\/h2>\n<p>Centos\u4e0a\u3067uwsgi\u3092\u52d5\u304b\u3057\u3066\u307f\u307e\u3059\u3002\u5229\u7528\u3059\u308b\u74b0\u5883\u306f\u4ee5\u4e0b\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<ul>\n<li>Centos 7<\/li>\n<li>Python 3.6<\/li>\n<li>uWSGI(2.0.17.1)<\/li>\n<li>Flask(1.0.2)<\/li>\n<\/ul>\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\/opt\u914d\u4e0b\u306b\u914d\u7f6e\u3057\u307e\u3059\u3002\u307e\u305f\u3001Python\u306e\u4eee\u60f3\u74b0\u5883\u3068\u3057\u3066\u3001venv\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002venv\u306e\u74b0\u5883\u3082\/opt\u914d\u4e0b\u306b\u914d\u7f6e\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\/opt\r\n\u251c\u2500\u2500 apps\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 current\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 sample_api\r\n\u2514\u2500\u2500 envs\r\n    \u2514\u2500\u2500 sample_api\r\n\r\n<\/pre>\n<p>\u5b66\u7fd2\u7528\u3068\u3057\u3066Python\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\/opt\/apps\/current\u306e\u4e0b\u306bflask\u30d5\u30a1\u30a4\u30eb\u76f4\u63a5\u914d\u7f6e\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u5b9f\u904b\u7528\u3067\u306f\u30ea\u30ea\u30fc\u30b9\u7528\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u3092\u5f35\u308b\u306e\u304c\u4e00\u822c\u7684\u3067\u3059\u3002\u305d\u308c\u4ee5\u5916\u306f\u307b\u307c\u305d\u306e\u307e\u307e\u672c\u756a\u3067\u4f7f\u3048\u308b\u5185\u5bb9\u306b\u306a\u3063\u3066\u3044\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001pid\u30d5\u30a1\u30a4\u30eb\u306f\/var\/run\/uwsgi\/uwsgi.pid\u3001\u30ed\u30b0\u306f\/var\/log\/uwsgi\/uwsgi.log\u306b\u914d\u7f6e\u3059\u308b\u3082\u306e\u3068\u3057\u307e\u3059\u3002<\/p>\n<h2>Python3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n<p>Centos7\u304c\u8d77\u52d5\u6e08\u307f\u3067\u3042\u308b\u3053\u3068\u3092\u524d\u63d0\u3068\u3057\u307e\u3059\u3002\u307e\u305a\u306fPython3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo yum install -y https:\/\/centos7.iuscommunity.org\/ius-release.rpm\r\nsudo yum install -y python36u python36u-libs python36u-devel python36u-pip\r\n<\/pre>\n<p>\u6b21\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u7528\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u3068\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\u7528\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n# \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u914d\u7f6e\u7528\r\nsudo mkdir -p \/opt\/apps\/current\r\n\r\n# venv\u914d\u7f6e\u7528\r\nsudo mkdir -p \/opt\/envs\r\n\r\n# \u30ed\u30b0\u914d\u7f6e\u7528\r\nsudo mkdir -p \/var\/log\/uwsgi\r\n\r\n# pid\u30d5\u30a1\u30a4\u30eb\u914d\u7f6e\u7528\r\nsudo mkdir -p \/var\/run\/uwsgi\r\n\r\n# \u5b9f\u52b9\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u3001\u6a29\u9650\u8a2d\u5b9a\r\nsudo useradd pyuser\r\nsudo chown -R pyuser:pyuser \/opt\/apps\/\r\nsudo chown -R pyuser:pyuser \/opt\/envs\/\r\nsudo chown -R pyuser:pyuser \/var\/log\/uwsgi\r\nsudo chown -R pyuser:pyuser \/var\/run\/uwsgi\r\n<\/pre>\n<h2>\u74b0\u5883\u8a2d\u5b9a\u3068flaskWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u914d\u7f6e<\/h2>\n<p>\u6b21\u306b\u3001\u74b0\u5883\u8a2d\u5b9a\u3068Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u914d\u7f6e\u3057\u307e\u3059\u3002\u307e\u305a\u306fvenv\u3067\u74b0\u5883\u3092\u4f5c\u6210\u3057\u3001\u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n# \u5b9f\u52b9\u30e6\u30fc\u30b6\u30fc\u306b\u5207\u308a\u66ff\u3048\r\nsudo su pyuser\r\n\r\n# \u5b9f\u884c\u7528\u306e\u74b0\u5883\u3092\u4f5c\u6210\r\ncd \/opt\/envs\/\r\npython3.6 -m venv sample_api\r\n\r\n# \u74b0\u5883\u5207\u308a\u66ff\u3048\r\nsource \/opt\/envs\/sample_api\/bin\/activate\r\n\r\n# \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\r\npip install uWSGI\r\npip install flask\r\n<\/pre>\n<p>\u3053\u306e\u4f8b\u3067\u306f\u5b9f\u52b9\u30e6\u30fc\u30b6\u30fc\u3092\u8a2d\u5b9a\u3057\u3066venv\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u304c\u3001docker\u7b49\u306e\u30b3\u30f3\u30c6\u30ca\u3067\u5358\u4e00\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u52d5\u304b\u3059\u5834\u5408\u306froot\u3067venv\u3092\u4f7f\u308f\u305a\u306b\u76f4\u63a5\u5b9f\u884c\u3059\u308b\u307b\u3046\u304c\u4e00\u822c\u7684\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u914d\u7f6e\u3057\u307e\u3059\u3002run.py\u3068\u3044\u3046\u540d\u524d\u306epython\u30d5\u30a1\u30a4\u30eb\u3092\u914d\u7f6e\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncd \/opt\/apps\/current\r\nmkdir sample_api\r\nvi \/opt\/apps\/current\/sample_api\/run.py\r\n<\/pre>\n<p>\u5185\u5bb9\u306f\u524d\u56de\u4f7f\u7528\u3057\u305f\u3001\u9069\u5f53\u306ajson\u3092\u8fd4\u3059\u3060\u3051\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# run.py\r\nfrom flask import Flask, jsonify\r\n \r\napp = Flask(__name__)\r\n \r\n \r\n@app.route('\/')\r\ndef api_sample():\r\n    &quot;&quot;&quot;\r\n    API\u30b5\u30f3\u30d7\u30eb\r\n    :return:\r\n    &quot;&quot;&quot;\r\n    result = {&quot;code&quot;: &quot;001&quot;, &quot;name&quot;: &quot;apple&quot;}\r\n    return jsonify(ResultSet=result)\r\n \r\n \r\nif __name__ == '__main__':\r\n    app.run()\r\n<\/pre>\n<p>\u3053\u3053\u3067venv\u306e\u74b0\u5883\u304c\u6b63\u3057\u304f\u52d5\u4f5c\u3057\u3066\u3044\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3001python\u30b3\u30de\u30f3\u30c9\u306e\u52d5\u4f5c\u78ba\u8a8d\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncd \/opt\/apps\/current\/sample_api\/\r\npython run.py\r\n<\/pre>\n<p>http:\/\/localhost:8080\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u5024\u304c\u8fd4\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<h2>uwsgi\u306e\u8a2d\u5b9a<\/h2>\n<p>uwsgi\u306e\u8a2d\u5b9a\u3092\u884c\u3044\u307e\u3059\u3002uwsgi.ini\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvi \/opt\/apps\/current\/sample_api\/uwsgi.ini\r\n<\/pre>\n<p>\u4ee5\u4e0b\u306e\u901a\u308a\u8a18\u8ff0\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n[uwsgi]\r\n# wsgi\u306e\u8a2d\u5b9a\r\ncurrent_release = \/opt\/apps\/current\/sample_api\r\nchdir = %(current_release)\r\nwsgi-file=%(current_release)\/run.py\r\ncallable = app\r\nmaster = True\r\n\r\n# \u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u30db\u30b9\u30c8:\u30dd\u30fc\u30c8\r\nhttp=0.0.0.0:8080\r\n\r\n# \u30ed\u30b0\r\ndaemonize = \/var\/log\/uwsgi\/uwsgi.log\r\n\r\n# \u5b9f\u52b9\u30e6\u30fc\u30b6\u30fc\/\u30b0\u30eb\u30fc\u30d7\r\nuid = pyuser\r\ngid = pyuser\r\n\r\n# pid\u30d5\u30a1\u30a4\u30eb\r\npidfile = \/var\/run\/uwsgi\/uwsgi.pid\r\n\r\n# pid\u30d5\u30a1\u30a4\u30eb\u30af\u30ea\u30a2\r\nvacuum = true\r\n\r\n# \u30d7\u30ed\u30bb\u30b9\u6570\u306a\u3069\r\nprocesses = 2\r\nthreads = 2\r\nthunder-lock = true\r\nmax-requests = 3000\r\nmax-requests-delta = 300\r\n<\/pre>\n<p>\u4eca\u5ea6\u306fuwsgi\u306e\u52d5\u4f5c\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u5916\u90e8\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nuwsgi --http=0.0.0.0:8080 --wsgi-file=run.py  --callable app\r\n<\/pre>\n<p>uwsgi\u304c\u554f\u984c\u306a\u304f\u52d5\u3051\u3070pyuser\u3067\u306e\u4f5c\u696d\u306f\u4e00\u65e6\u7d42\u308f\u308a\u3067\u3059\u3002ctrl + c\u3067uwsgi\u3092\u505c\u6b62\u3057\u305f\u5f8c\u3001exit\u3067\u4e00\u65e6\u629c\u3051\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nexit\r\n<\/pre>\n<h2>\u30b5\u30fc\u30d3\u30b9\u767b\u9332<\/h2>\n<p>\u6700\u5f8c\u306b\u30e6\u30cb\u30c3\u30c8\u5b9a\u7fa9\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u30b5\u30fc\u30d3\u30b9\u767b\u9332\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30e6\u30cb\u30c3\u30c8\u5b9a\u7fa9\u30d5\u30a1\u30a4\u30eb\u3092\u65b0\u898f\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo vi \/etc\/systemd\/system\/sample.service\r\n<\/pre>\n<p>\u8a18\u8ff0\u5185\u5bb9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n[Unit]\r\nDescription = sample daemon\r\nAfter=network.target\r\n\r\n[Service]\r\nUser=pyuser\r\nGroup=pyuser\r\nWorkingDirectory=\/opt\/apps\/current\/sample_api\r\nEnvironment=&quot;PATH=\/opt\/envs\/sample_api\/bin&quot;\r\nExecStart = \/opt\/envs\/sample_api\/bin\/uwsgi --ini uwsgi.ini\r\nExecStop = \/opt\/envs\/sample_api\/bin\/uwsgi --stop \/var\/run\/uwsgi\/uwsgi.pid\r\nType = forking\r\nRemainAfterExit = yes\r\n\r\n[Install]\r\nWantedBy = multi-user.target\r\n<\/pre>\n<p>systemctl\u3092\u30ea\u30ed\u30fc\u30c9\u3057\u3066\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo systemctl daemon-reload\r\n<\/pre>\n<p>\u30b5\u30fc\u30d3\u30b9\u304c\u958b\u59cb\/\u7d42\u4e86\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n# \u30b5\u30fc\u30d3\u30b9\u306e\u958b\u59cb\r\nsudo systemctl start sample\r\n\r\n# \u30b5\u30fc\u30d3\u30b9\u306e\u7d42\u4e86\r\nsudo systemctl stop sample\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u306e\u7d9a\u304d\u3067\u3001\u4eca\u56de\u306fPython\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u3001uWSGI\u3092Centos7\u3067\u52d5\u304b\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002 Linux\u306e\u5165\u9580\u77e5\u8b58\u304c\u4e0d\u5b89\u306a\u65b9\u306f\u3001\u4ee5\u4e0b\u306b\u307e\u3068\u3081\u3066\u3044\u307e\u3059\u306e\u3067\u9069\u5b9c\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002 Linux\u5b66\u7fd2\u8b1b\u5ea7 \u8d85\u5165\u9580\u7de8 \u6982...<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/posts\/2023"}],"collection":[{"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/comments?post=2023"}],"version-history":[{"count":8,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/posts\/2023\/revisions"}],"predecessor-version":[{"id":2031,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/posts\/2023\/revisions\/2031"}],"wp:attachment":[{"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/media?parent=2023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/categories?post=2023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.python.ambitious-engineer.com\/wp-json\/wp\/v2\/tags?post=2023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}